【发布时间】:2017-03-12 05:48:23
【问题描述】:
假设我有 2 个线程:
int value = 0;
std::atomic<bool> ready = false;
thread 1:
value = 1
ready = true;
thread 2:
while (!ready);
std::cout << value;
这个程序能输出0吗?
我阅读了有关 C++ 内存模型的信息——特别是顺序一致性,我认为这是默认的,但并不是特别清楚。编译器是否只需要将原子操作相对于彼此以正确的顺序放置,还是需要将原子操作相对于所有其他操作以正确的顺序放置?
【问题讨论】:
-
比这复杂一点:需要考虑 in-thread 和 between-threads 顺序。基本上,这些规则“按预期”工作,因此代码是正确的,并且按照您的想法执行。
-
为了顺序一致性,它很像一个屏障;它上面的东西不能重新排列在后面,下面的东西不能重新排列在它前面。其他值是否是原子的都没关系。在这种情况下,你很好。
-
@ShadowRanger C/C++ 中没有“重排”的概念。
-
@curiousguy:我为使用同义词道歉?我不知道你在这里找什么。
-
@ShadowRanger 的同义词是什么?什么标准术语是“重新排列”的 syn 并用于定义 C/C++ MT 语义?我只是说您无法根据可重新排列的代码进行推理。 C/C++ 不能那样工作。
标签: c++ multithreading memory-model stdatomic