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

Exa*_*eta 2 c++ atomic atomicity memory-barriers stdatomic

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

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

T.C*_*.C. 5

只有B(我将假设“下一个”是指原子的修改顺序,A -> B -> C因此[atomics.order]p11 C的 RMW 必须读取B写入的值)。请参阅[intro.races]p6 中的注释:

除非在指定的情况下,读取较晚的值不一定确保可见性,如下所述。这种要求有时会干扰有效实施。

的读取部分fetch_add是一个获取操作,它从存储释放中获取其值,因此存储释放通过[atomics.order]p2与 RMW 同步 :

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

但是,线程 B 执行的存储/释放不是 RMW 操作,因此不是线程 A 的存储所领导的释放序列的一部分(参见[intro.races]p5)。因此,线程 A 的存储不会与fetch_add.