atomic_thread_fence

来自cppreference.com
< c | atomic
在标头 <stdatomic.h> 定义
void atomic_thread_fence( memory_order order );
(C11 起)

建立以 order 指示的非原子和宽松原子访问的内存同步定序,而无需关联的原子操作。但需要至少一个原子操作来建立同步,如下所述。

栅栏-原子同步

线程 A 中的释放栅栏 F 同步于线程 B 中的原子获得操作(acquire operation) Y,若

  • 存在原子存储 X(带任何内存定序)
  • Y 读取 X 所写入的值(或会为 X 所引领的释放序列所写入的值,若 X 是释放操作)
  • F 在线程 A 中先序于 X

此情况下,所有线程 A 中先序于 F 的非原子和宽松原子存储将先发生于线程 B 中所有 Y 后的,来自同一位置的非原子和宽松原子加载。

原子-栅栏同步

线程 A 中的原子释放操作(release operation) X 同步于线程 B 中的获得栅栏 F,若

  • 存在原子读取 Y (带任何内存定序)
  • Y 读取 X (或 X 所引领的释放序列)所写入的值
  • Y 在线程 B 中先序于 F

此情况下,线程 A 中所有先序于 X 的非原子和宽松原子存储,将先发生于线程 B 中所有 F 后的,来自同一位置的非原子和宽松原子加载。

栅栏-栅栏同步

线程 A 中的释放栅栏 FA 同步于线程 B 中的获得栅栏 FB,若

  • 存在原子对象 M ,
  • 线程 A 中存在修改 M 的原子写入 X(带任何内存定序)
  • 线程 A 中 FA 先序于 X
  • 线程 B 中存在原子读取 Y(带任何内存定序)
  • Y 读取 X 所写入的值(或会为 X 所引领的释放序列所写入的值,若 X 是释放操作)
  • 线程 B 中 Y 先序于 FB

此情况下,线程 A 中所有先序于 FA 的非原子和宽松原子存储,将先发生于线程 B 中所有 FB 后的,来自同一位置的非原子和宽松原子加载。

取决于 order,此操作

  • 无效果,若 order == memory_order_relaxed
  • 是获得栅栏,若 order == memory_order_acquire || order == memory_order_consume
  • 是释放栅栏,若 order == memory_order_release
  • 既是获得栅栏也是释放栅栏,若 order == memory_order_acq_rel
  • 既是获得栅栏也是释放栅栏且具有序列一致性,若 order == memory_order_seq_cst

参数

order - 此栅栏执行的内存顺序

返回值

(无)

注解

在 x86(包括 x86-64)上,除了 atomic_thread_fence(memory_order_seq_cst) 之外,atomic_thread_fence 函数不会发出 CPU 指令,而仅会影响编译时代码移动。

atomic_thread_fence 强加的同步制约强于带同一 memory_order 的原子存储操作。在原子存储释放操作阻止所有前驱写入被移动到存储释放之后的同时,带 memory_order_release 定序的 atomic_thread_fence 还阻止所有前驱写入被移动到后继存储之后。

引用

  • C17 标准(ISO/IEC 9899:2018):
  • 7.17.4.1 The atomic_thread_fence function (第 204 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.17.4.1 The atomic_thread_fence function (第 278-279 页)

参阅

线程与执行于同一线程的信号处理函数间的栅栏
(函数)
atomic_thread_fence 的 C++ 文档