c++ - 原子释放可以是 "overwritten"吗?

标签 c++ atomic stdatomic memory-barriers

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

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

最佳答案

B(我假设“下一个”意味着原子的修改顺序是A -> B -> C,因此通过[atomics.order]p11 C 的 RMW 必须读取 B 写入的值)。请参阅 [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 的读取部分是一个获取操作,它从 store-release 中获取其值,因此 store release 通过 [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 执行的存储/释放不是 RMW 操作,因此不是以线程 A 的存储为首的释放序列的一部分(请参阅 [intro.races]p5 )。因此,线程 A 的存储不与 fetch_add 同步。

关于c++ - 原子释放可以是 "overwritten"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50573323/

相关文章:

java - id = 1 - id 是原子的吗?

C++多线程: Visible side-effects of non-atomic variables

c++ - 打印出一个 std::vector<std::wstring>

c++ - 如何将构造函数(可变参数)作为模板参数传递?

c++ - 编写库时是否应将可见性/导出宏应用于模板?

python - MongoDB 原子性问题——修改内存中的文档

c++ - 如何通过透明代理实现SSL隧道?

c++ - std::memory_order和指令顺序,澄清

c++ - atomic<T>.load() 与 std::memory_order_release

c++ - 原子读取是否保证读取到最新值?