原子释放可以被“覆盖”吗?

时间:2018-05-28 20:55:48

标签: c++ atomic atomicity stdatomic memory-barriers

说我有atomic<int> i;线程A使用memory_order_release执行原子存储/交换。接下来,线程B使用memory_order_release执行原子存储。线程C执行原子fetch_add(0,memory_order_acquire);

线程C是否从线程 A和B 仅线程B 获取依赖关系?

2 个答案:

答案 0 :(得分:3)

B(我将假设通过&#34; next&#34;您的意思是原子的修改顺序为A -> B -> C,以便[atomics.order]p11 C的RMW必须读取值B写的)。请参阅[intro.races]p6中的说明:

  

除了在指定的情况下,读取更晚的值不会   必须确保如下所述的可见性。这样的要求   有时会干扰有效的实施。

fetch_add的读取部分是从商店发布中获取其值的获取操作,因此商店版本与[atomics.order]p2的RMW同步:

  

对原子执行释放操作的原子操作A.   对象M与执行a的原子操作B同步   获取对M的操作并从中获取其中任何副作用的值   以A为首的释放序列。

但是,线程B执行的存储/释放不是RMW操作,因此不是线程A商店的发布序列的一部分(参见[intro.races]p5)。因此,主题A的商店不会与fetch_add同步。

答案 1 :(得分:0)

编辑:见T.C。

的回答

这只留下我回答的这一部分:

我强烈建议将atomics与其默认内存顺序(memory_order_seq_cst)一起使用,除非你有一个非常好的理由(测量性能)。