假设我有 2 个线程:
int value = 0;
std::atomic<bool> ready = false;
thread 1:
value = 1
ready = true;
thread 2:
while (!ready);
std::cout << value;
这个程序能输出0吗?
我阅读了有关 C++ 内存模型的内容 - 特别是顺序一致性,我认为这是默认设置,但并不是特别清楚。编译器是否只需要将原子操作以相对于彼此的正确顺序放置,或者是否需要将原子操作以相对于所有其他操作的正确顺序放置?
最佳答案
默认情况下,对原子变量的操作是使用 memory_order_seq_cst
完成的语义,保证不会进行重新排序。
因此该行:value = 1
不能在原子分配以下重新排序:value = 1
, 所以行 std::cout << value;
将始终打印 1。
按照相同的规则,行:std::cout << value;
无法重新排序
在线上方:while (!ready);
.
关于c++ - 在 C++ 中重新排序原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40320254/