c++ - 我是否正确理解 std::memory_order 的语义?
问题描述
c++reference.com声明memory_order::seq_cst
:
具有此内存顺序的加载操作执行获取操作,存储执行释放操作,读取-修改-写入执行获取操作和释放操作,另外存在一个总顺序,其中所有线程都观察内存中的所有修改相同的顺序。
[ Q1 ]:这是否意味着顺序通过所有(其他+此)atomic_vars with memory_order::seq_cst 的每个操作直接下降?
[Q2]: 和release
,acquire
和rel_acq
不包括在“单次总订单”中?
我理解这seq_cst
相当于其他三个具有写入、读取和 write_read 操作,但我很困惑是否seq_cst
也可以订购其他 atomic_var,而不仅仅是同一个 var。
解决方案
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 原子操作
推荐阅读
- java - JPA / Hibernate - NamedEntityGraph 中的子类子图被忽略
- html - CSS Flex 基础孙子
- python - 使用python接收高速率的UDP数据包
- sql - PL/SQL 代码中的布尔变量声明和使用有什么问题?
- sql - SQL Server XML 查询
- javascript - 如何将具有多个同名输入的数据插入数据库?
- java - logstash 找不到 jdk
- xcode - 如何使用 CocoaPods 为 SwiftLint 排除文件/文件夹?
- docker - 为什么 Windows docker 容器在 sleep 命令完成之前提前退出?
- node.js - js中的console.log()和console.error()有什么区别?