c++ - 可以“覆盖”原子释放吗?
问题描述
假设我有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中的注释:
除非在特定情况下,读取后面的值不一定能确保可见性,如下所述。这样的要求有时会干扰有效的实施。
的读取部分fetch_add
是一个从 store-release 获取值的获取操作,因此 store release 通过 [atomics.order]p2与 RMW 同步:
对原子对象 M 执行释放操作的原子操作 A 与对 M 执行获取操作的原子操作 B 同步,并从以 A 为首的释放序列中的任何副作用获取其值。
但是,线程 B 执行的存储/释放不是 RMW 操作,因此不是由线程 A 的存储引导的释放序列的一部分(参见[intro.races]p5)。因此,线程 A 的存储不与fetch_add
.
推荐阅读
- git - 尽管 core.autocrlf=true,Git 在 Windows 上仅以 LF 行结尾签出特定文件
- javascript - 设计一个提供无事件数据的 VueJS 组件
- logging - 在 bigquery 中创建谷歌云日志接收器的问题
- javascript - 使用 javascript 在 html 中添加 SVG 的最佳方法是什么?
- apollo-server - 如何使用 apollo-server(gRPC,而不是 REST)实现部分查询缓存
- unit-testing - 有没有办法构建包含测试文档字符串的 Rust 文档?
- git - Git子模块哈希不断引起冲突
- python - 密码/访问密钥过期时如何通知 IAM 用户?
- sql - SQLQuery 不返回查询的文档
- python - 按键盘上的 Q 键无法完成游戏