原子能
作为 C 语言的一部分,Atomics 是自 C11 以来可用的可选功能。
它们的目的是确保在不同线程之间共享变量的无竞争访问。如果没有原子限定,如果两个线程同时访问它,则共享变量的状态将是未定义的。例如,递增操作(++
)可以分成几个汇编指令,一个读取,一个加法本身和一个存储指令。如果另一个线程将执行相同的操作,则它们的两个指令序列可能交织在一起并导致不一致的结果。
-
类型: 除了数组类型之外的所有对象类型都可以使用
_Atomic
进行限定。 -
运算符: 所有读取 - 修改 - 写入运算符(例如
++
或*=
)都保证是原子的。 -
操作: 还有一些其他操作被指定为类型泛型函数,例如
atomic_compare_exchange
。 -
线程: 当它们被不同的线程访问时,保证不会访问它们。
-
信号处理程序:如果原子类型上的所有操作都是无状态的,则称为无锁定。在这种情况下,它们还可用于处理正常控制流和信号处理程序之间的状态变化。
-
只有一种数据类型可以保证无锁:
atomic_flag
。这是一种最小类型,其操作旨在映射到有效的测试和设置硬件指令。
在 C11 的线程接口中可以使用其他避免竞争条件的方法,特别是互斥类型 mtx_t
,以相互排除线程访问关键数据或关键代码段。如果没有原子,必须使用这些来防止匹配。