原子能

作为 C 语言的一部分,Atomics 是自 C11 以来可用的可选功能。

它们的目的是确保在不同线程之间共享变量的无竞争访问。如果没有原子限定,如果两个线程同时访问它,则共享变量的状态将是未定义的。例如,递增操作(++)可以分成几个汇编指令,一个读取,一个加法本身和一个存储指令。如果另一个线程将执行相同的操作,则它们的两个指令序列可能交织在一起并导致不一致的结果。

  • 类型: 除了数组类型之外的所有对象类型都可以使用 _Atomic 进行限定。

  • 运算符: 所有读取 - 修改 - 写入运算符(例如++*=)都保证是原子的。

  • 操作: 还有一些其他操作被指定为类型泛型函数,例如 atomic_compare_exchange

  • 线程: 当它们被不同的线程访问时,保证不会访问它们。

  • 信号处理程序:如果原子类型上的所有操作都是无状态的,则称为无锁定。在这种情况下,它们还可用于处理正常控制流和信号处理程序之间的状态变化。

  • 只有一种数据类型可以保证无锁:atomic_flag。这是一种最小类型,其操作旨在映射到有效的测试和设置硬件指令。

在 C11 的线程接口中可以使用其他避免竞争条件的方法,特别是互斥类型 mtx_t,以相互排除线程访问关键数据或关键代码段。如果没有原子,必须使用这些来防止匹配。