首页 > 解决方案 > 我是否正确理解 std::memory_order 的语义?

问题描述

c++reference.com声明memory_order::seq_cst

具有此内存顺序的加载操作执行获取操作,存储执行释放操作,读取-修改-写入执行获取操作和释放操作,另外存在一个总顺序,其中所有线程都观察内存中的所有修改相同的顺序。

[ Q1 ]:这是否意味着顺序通过所有(其他+此)atomic_vars with memory_order::seq_cst 的每个操作直接下降?

[Q2]: 和release,acquirerel_acq不包括在“单次总订单”中?

我理解这seq_cst相当于其他三个具有写入、读取和 write_read 操作,但我很困惑是否seq_cst也可以订购其他 atomic_var,而不仅仅是同一个 var。

标签: c++multithreadingmemory-barriersstdatomicmemory-model

解决方案


cppreference 只是 C++ 标准的一个总结,有时它的文字不够精确。实际的标准草案清楚地表明:最终的 C++20 工作草案 N4681在 atomics.order 中声明,par。4(第 1525 页):

所有操作(包括围栏)都有一个单一的总订单 S memory_order::seq_cst,它满足以下约束 [...]

这清楚地说明了所有 seq_cst操作,而不仅仅是对特定对象的所有操作。

并且注释 6 和 7 进一步强调该命令不适用于较弱的内存命令:

6 [注:我们不要求 S 与“发生在之前”(6.9.2.1)一致。这允许在某些机器架构上更有效地实现 memory_order::acquire 和 memory_order::release。当这些与 memory_order::seq_cst 访问混合时,它会产生令人惊讶的结果。——尾注]

7 [注意:memory_order::seq_cst 仅确保没有数据竞争且仅使用 memory_order::seq_cst 原子操作的程序的顺序一致性。除非非常小心,否则任何使用较弱的排序都会使此保证失效。在很多情况下,memory_order::seq_cst 原子操作


推荐阅读