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(使用前将#替换为@)