看到赫伯·萨特斯表现出色后talk about “原子武器”我有点困惑轻松原子例子。
我随身携带了一个atomic in the 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)
Since load is 获取 and 不释放,为什么这与(1)
and (2)
? 实际上是什么is在这里放松吗?
我唯一能想到的是我误解了load means acquire。如果这是真的,并且默认seq_cst
两者都意味着,这不是意味着一个完整的栅栏吗——没有任何东西可以越过该指令,也不能向下传递?我一定误解了那部分。
[并且对称地store and release].
打电话可能有点混乱myatomic.load(std::memory_order_acquire);
“宽松原子”负载,因为有std::memory_order_relaxed
。有些人描述了任何弱于seq_cst
作为“放松”。
您注意到顺序一致加载是获取加载是正确的,但它有一个额外的要求:顺序一致加载也是所有 seq_cst 操作的总全局顺序的一部分。
当您处理多个原子变量时,它就会发挥作用:两个原子的单独修改顺序可能以不同线程的不同相对顺序出现,除非强加顺序一致性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)