原子释放可以是"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
.
不同步
假设我有 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:
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
.