原子释放可以是"overwritten"吗?

Can an atomic release be "overwritten"?

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

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

编辑:参见 T.C 的答案。

这只剩下我的这部分答案:

我强烈建议使用具有默认内存顺序的原子 (memory_order_seq_cst),除非您有充分的理由(衡量性能)不这样做。

只有 B(我假设 "next" 你的意思是原子的修改顺序是 A -> B -> C 所以 [atomics.order]p11 C's RMW must read the value B wrote). See the note in [intro.races]p6:

Except in the specified cases, reading a later value does not necessarily ensure visibility as described below. Such a requirement would sometimes interfere with efficient implementation.

fetch_add 的读取部分是从存储发布中获取其值的获取操作,因此存储发布通过 [atomics.order]p2:

与 RMW 同步

An atomic operation A that performs a release operation on an atomic object M synchronizes with an atomic operation B that performs an acquire operation on M and takes its value from any side effect in the release sequence headed by A.

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

不同步