【发布时间】:2021-07-05 05:59:21
【问题描述】:
正如c/c++标准所说,char的大小必须是1。据我了解,这意味着 CPU 保证对 char 的任何读取或写入都必须在一条指令中完成。
假设我们有很多线程,它们共享一个char 变量:
char target = 1;
// thread a
target = 0;
// thread b
target = 1;
// thread 1
while (target == 1) {
// do something
}
// thread 2
while (target == 1) {
// do something
}
总而言之,线程有两种:一种是把target设置成0或1,另一种是把target == 1做一些任务。目的是我们可以通过修改target的值来控制task-threds。
据我了解,我们似乎根本不需要使用mutex/lock。但是我的编码经验让我有一种强烈的感觉,在这种情况下我们必须使用mutex/lock。
我现在很困惑。在这种情况下我应该使用mutex/lock 吗?
你看,我可以理解为什么我们在其他情况下需要mutex/lock,例如i++。因为i++ 不能仅在一条指令中完成。那么target = 0 可以在一条指令中完成,对吗?如果是这样,是否意味着在这种情况下我们不需要mutex/lock?
好吧,我知道我们可以使用std::atomic,所以我的问题是:既不使用mutex/lcok 也不使用std::atomic 是否可以。
【问题讨论】:
-
永远不要做任何假设。它可以被打断。如果您不想使用互斥锁,也许 volatile sig_atomic_t 会有所帮助。
-
在这种情况下,目标没有标记为易失性,因此编译器可能只会执行一次读取。
-
我期待有评论提到 volatile,所以我已经准备好链接 When to use volatile with multi threading?
-
@MatG 同步的东西来自 sig_atomic_t,而不是来自 volatile。如果有,请准备另一个链接。
-
@tango-1 事实上,
sig_atomic_t只不过是一个typedef int...而volatile sig_atomic_t在多核机器中不是线程安全的。
标签: c++ c multithreading locking mutex