以下引用自C++标准-内存顺序:
如果线程 A 中的原子存储标记为 memory_order_release,并且线程 B 中来自同一变量的原子加载标记为 memory_order_acquire,则从线程的角度来看,在原子存储之前发生的所有内存写入(非原子和宽松原子) A,在线程 B 中成为可见的副作用。也就是说,一旦原子加载完成,线程 B 就保证可以看到线程 A 写入内存的所有内容。
仅在释放和获取同一原子变量的线程之间建立同步。其他线程可以看到与任一或两个同步线程不同的内存访问顺序。
考虑一个原子变量v和以下步骤:
A存储vmemory_order_releaseB存储vmemory_order_releaseC加载vmemory_order_acquire以下陈述是否正确:“线程C保证能看到线程A或的所有内容”B写入内存的所有内容。”
编辑:我将我的评论移到此处以使这一点更清楚。
我在那里引用的 C++ 并没有说B必须阅读A. 它所说的只是在同一个变量上释放/获取A。B这正是我在这三个步骤中所做的:A释放B一些东西,并C获取一些东西。规范中哪里说获取与上一个版本匹配的内容,而不一定是之前版本的任何内容?