重新排序C ++中的原子操作

mat*_*ts1 7 c++ multithreading memory-model stdatomic

假设我有2个线程:

int value = 0;
std::atomic<bool> ready = false;

thread 1:
value = 1
ready = true;

thread 2:
while (!ready);
std::cout << value;
Run Code Online (Sandbox Code Playgroud)

这个程序能输出0吗?

我读到了有关C ++内存模型的信息-具体来说,是顺序一致性,我认为这是默认设置,但并不是特别清楚。是仅要求编译器相对于彼此以正确的顺序放置原子操作,还是相对于所有其他操作以正确的顺序放置原子操作?

250*_*501 6

默认情况下,对原子变量的操作是使用memory_order_seq_cst语义完成的,这保证了不会进行任何重新排序。

因此,行:value = 1不能在原子分配:之下重新排序value = 1,因此该行将std::cout << value;始终显示1。

按照相同的规则,行:std::cout << value;不能在行:
上方重新排序while (!ready);