执行原子操作的函数

Jay*_*Jay 8 c atomicity

是否有用于执行C运行时库或任何其他实用程序库支持的原子操作(如整数的递增/递减)等功能?

如果是,那么使用这些函数可以使所有操作成为原子的?

使用这些函数比正常的同步原语(如互斥体等)更有益吗?

操作系统:Windows,Linux,Solaris和VxWorks

Jer*_*fin 7

在C11之前

C库没有任何.

在Linux上,GCC提供了一些-看的__sync_fetch_and_add,__sync_fetch_and_sub等.

在Windows的情况下,寻找InterlockedIncrement,InterlockedDecrement``,InterlockedExchange`,等等.如果你在Windows上使用gcc,我猜它也有与Linux上相同的内置函数(尽管我还没有验证过).

在Solaris上,它取决于它.大概如果你使用gcc,它可能(再次)拥有与它在Linux下相同的内置函数.否则,周围有图书馆,但没有真正标准化.

C11

C11添加了(合理)完整的原子操作和原子类型集.这些操作包括像atomic_fetch_addatomic_fetch_sum(和*_explicit的版本相同,让你指定你所需要的订货模式,即默认的始终使用memory_order_seq_cst).还有一些fence功能,例如atomic_thread_fenceatomic_signal_fence.

类型对应于每个普通整数类型 - 例如,atomic_int8_t对应于int8_tatomic_uint_least64_t对应于uint_least64_t.这些是typedef在中定义的名称<stdatomic.h>.为避免与任何现有名称冲突,可以省略标题; 编译器本身在实现者的命名空间中使用名称(例如,_Atomic_uint_least32_t而不是atomic_uint_least32_t).

  • _synch_fetch_and_*可以很好地移植到可以托管gcc的任何东西,除了ARM.+1 (2认同)