标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?

Does a single atomic operation marked as std::memory_order_seq_cst trigger sequential consistency everywhere?

本文关键字:位置 一致性 顺序 原子操作 order memory std 记为 seq cst 单个      更新时间:2023-10-16

>顺序一致性在所有线程上强加所有原子操作的全局顺序。据我所知,这意味着线程的行为将按照源代码中指定的方式运行,无需重新排序。所有线程将按顺序执行其操作。

直观地说,它看起来像是在多线程应用程序的main()函数中设置的选项或标志,例如"我希望我的所有线程都遵循顺序一致性"。当然,C++没有这样的事情。

所以我的问题来了:代码中任何地方单独存在单个x.load(std::memory_order_seq_cst)x.store(y, std::memory_order_seq_cst)指令是否足以强制所有线程,即使是那些与x无关的线程以顺序一致的方式运行?

不,memory_order_seq_cst只保证所有memory_order_seq_cst原子访问/围栏的总顺序,请参阅 C++17 标准最终草案的 [atomics.order]/3。它不会对其他内存访问施加此要求,即使是对内存顺序较弱的原子访问也是如此。

例如,如果对于两个原子变量std::atomic<int> x{0}, y{0};0初始化,线程 1 执行

x.store(1, std::memory_order_seq_cst);

和线程 2 执行

y.store(1, std::memory_order_relaxed);

当线程 3 和 4 执行时

auto a = x.load(std::memory_order_relaxed);
auto b = y.load(std::memory_order_relaxed);

然后线程 3 可以例如观察a == 1b == 0,而线程 4 可以观察a == 0b == 1y不会通过任何memory_order_seq_cst操作进行访问,也不会与x存储区一起排序。因此,没有单一的线程间排序来确定存储xy发生的顺序。

在C++17标准最终草案[atomics.order]/8节中也有这方面的说明。