c++ - 在 C++ 中重新排序原子操作

标签 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;

这个程序能输出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/

相关文章:

c++ - 同一线程上的两个连续 memory_order_release 存储可以相互重新排序吗?

.net - 代码应该对CPU内存模型做出哪些假设,以及如何记录这些假设?

c++ - 将 C++11 std::thread 移植到 boost::thread 编译问题

C++ 查找实例化模板

c# - C# 中的队列和等待句柄

c++ - std::memory_order_seq_cst 是如何工作的

c++ - 通用四叉树

c++ - 检测模块 (DLL) 何时卸载

c++ - 为什么线程对类变量所做的更改没有影响?

c++ - UDP recvfrom 线程使用过多 CPU 资源