c - 用于执行原子操作的函数

标签 c atomic

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

如果是,那么使用此类函数可以使哪些操作成为原子操作?

使用此类函数会比互斥体等普通同步原语更有利吗?

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

最佳答案

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_add之类的内容。和atomic_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> 中定义的名称。为了避免与任何现有名称发生冲突,您可以省略 header ;编译器本身使用实现者命名空间中的名称(例如 _Atomic_uint_least32_t 而不是 atomic_uint_least32_t )。

关于c - 用于执行原子操作的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909672/

相关文章:

C11:定长数组声明如何符合 C11 标准的规范?

对 C 中 free() 的用法感到困惑

c - 执行时显示不需要的字符

c - 下标值既不是数组也不是指针也不是 vector (字符位置)

ios - 原子属性和非原子属性有什么区别?

mysql - 您可以使用 MySQLdb 的同一连接执行多个原子提交吗

c++ - 释放获取语义以计算平均值的下限和上限

java - 使用 SWIG 与数组交互的正确方法

C++:重新排序原子存储(发布)和加载(获取)

java - 二进制信号量的使用 - 无法正常工作(卖票)