首页 > 解决方案 > 可以“覆盖”原子释放吗?

问题描述

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

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

标签: c++atomicstdatomicmemory-barriers

解决方案


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

除非在特定情况下,读取后面的值不一定能确保可见性,如下所述。这样的要求有时会干扰有效的实施。

的读取部分fetch_add是一个从 store-release 获取值的获取操作,因此 store release 通过 [atomics.order]p2与 RMW 同步:

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

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


推荐阅读