c++ - 宽松的原子规则有什么(轻微)差异?

标签 c++ memory-barriers memory-model stdatomic relaxed-atomics

在看到赫伯·萨特斯出色之后talk关于“原子武器”我对轻松原子示例有点困惑。

我认为C++内存模型中的原子(SC-DRF =无数据竞争的顺序一致)在加载/上进行“获取”阅读。

据我所知,对于加载[和存储],默认值为std::memory_order_seq_cst,因此两者是相同的:

myatomic.load();                          // (1)
myatomic.load(std::memory_order_seq_cst); // (2)

到目前为止一切顺利,没有涉及松弛原子(听完演讲后我永远不会使用松弛原子。永远。保证。但是当有人问我时,我可能必须解释......)。

但为什么我使用时是“宽松”语义

myatomic.load(std::memory_order_acquire);   // (3)

既然load获取并且不是释放,为什么这与(1)不同>(2)这里实际上放松了什么?

我唯一能想到的是我误解了加载意味着获取。如果这是真的,并且默认的 seq_cst 意味着两者,那么这是否意味着一个完整的栅栏——没有任何东西可以向上或向下传递该指令?我肯定误解了那部分。

[并且对称地存储发布]。

最佳答案

调用 myatomic.load(std::memory_order_acquire); 可能会有点困惑“宽松原子”负载,因为有 std::memory_order_relaxed 。有些人描述任何弱于seq_cst的顺序“放松”。

您注意到顺序一致加载是获取加载是正确的,但它有一个额外的要求:顺序一致加载也是所有 seq_cst 操作的总全局顺序的一部分。

当您处理多个原子变量时,它就会发挥作用:两个原子的单独修改顺序可能会以不同线程的不同相对顺序出现,除非强加顺序一致性。

关于c++ - 宽松的原子规则有什么(轻微)差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17014375/

相关文章:

c++ - 输入字符数组并将其输出为整数数组

x86 - 断点在宽松内存模型上的行为

c - 什么时候可以将原子读取-修改-写入操作分解为组成宽松的操作+屏障?

c++ - gcc 不合并连续的栅栏

c++ - 推断函数指针或仿函数的返回类型

c++ - 在 makefile 中列出 .cpp 或 .o

c++ - 向 PDF 添加 FreeText 注释

c++ - 在 C++ 中,加载是否可以在获取操作下方滑动/存储可以在释放上方 float 吗?

windows - 为什么可以将 MemoryBarrier 实现为对 xchg 的调用?

c# - 是否可以从另一个线程观察部分构造的对象?