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_fence
和atomic_signal_fence
.
这些类型对应于每个普通整数类型——例如,atomic_int8_t
对应int8_t
和atomic_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/