说我有atomic<int> i;
线程A使用memory_order_release执行原子存储/交换。接下来,线程B使用memory_order_release执行原子存储。线程C执行原子fetch_add(0,memory_order_acquire);
线程C是否从线程 A和B 或仅线程B 获取依赖关系?
答案 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)一起使用,除非你有一个非常好的理由(测量性能)。