标准库中有执行原子操作的函数吗?

2023-11-25

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 and atomic_fetch_sum (and *_explicit相同的版本,可让您指定所需的订购模型,其中默认模型始终使用memory_order_seq_cst)。还有fence函数,例如atomic_thread_fence and atomic_signal_fence.

这些类型对应于每个普通整数类型——例如,atomic_int8_t对应于int8_t and atomic_uint_least64_t对应于uint_least64_t。那些是typedef中定义的名称<stdatomic.h>。为了避免与任何现有名称发生冲突,您可以省略标头;编译器本身使用实现者的命名空间中的名称(例如,_Atomic_uint_least32_t代替atomic_uint_least32_t).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标准库中有执行原子操作的函数吗? 的相关文章

随机推荐