在看到赫伯·萨特斯出色之后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/