Template:cpp/atomic/release-acquire

来自cppreference.com

若线程 A 中的一个原子存储被标以 memory_order_release,而线程 B 中从同一变量的原子加载被标以 memory_order_acquire,且线程 B 中的加载读到了线程 A 中的存储所写入的值,则线程 A 中的存储同步于线程 B 中的加载。

从线程 A 的视角先发生于原子存储的所有内存写入(包括非原子及宽松原子的),在线程 B 中成为可见副效应。即一旦原子加载完成,则保证线程 B 能观察到线程 A 写入内存的所有内容。仅当 B 实际上返回了 A 所存储的值或其释放序列中后面的值时,才有此保证。

同步仅建立在释放获得同一原子变量的线程之间。其他线程可能看到与被同步线程的一者或两者相异的内存访问顺序。

在强顺序系统(x86、SPARC TSO、IBM 大型机)上,释放-获得定序对于多数操作是自动进行的。无需为此同步模式发出额外的 CPU 指令,只有某些编译器优化受影响(例如,编译器被禁止将非原子存储移到原子存储-释放之后,或将非原子加载移到原子加载-获得之前)。在弱顺序系统(ARM、Itanium、Power PC)上,必须使用特别的 CPU 加载或内存栅栏指令。

互斥锁(例如互斥体原子自旋锁)是释放-获得同步的例子:线程 A 释放锁而线程 B 获得它时,发生于线程 A 上下文的临界区(释放之前)中的所有事件,必须对于执行同一临界区的线程 B(获得之后)可见。