C 执行原子操作的函数

C 执行原子操作的函数,c,atomicity,C,Atomicity,C运行时库或任何其他实用程序库是否支持执行原子操作(如整数的递增/递减)等的函数 如果是,使用这些函数可以使哪些操作成为原子操作 使用这样的函数会比使用互斥等常规同步原语更有益吗 操作系统:Windows、Linux、Solaris和VxWorks“有益”是根据情况而定的。通常,绩效取决于环境。当您为类似的东西关闭互斥锁时,您可能会期待一些美妙的事情发生,但是您可能没有得到任何好处(如果不是很流行的情况)或者使事情变得更糟(如果您意外地创建了一个“旋转锁”)。不确定您所说的C运行时库是什么意思。

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

如果是,使用这些函数可以使哪些操作成为原子操作

使用这样的函数会比使用互斥等常规同步原语更有益吗


操作系统:Windows、Linux、Solaris和VxWorks“有益”是根据情况而定的。通常,绩效取决于环境。当您为类似的东西关闭互斥锁时,您可能会期待一些美妙的事情发生,但是您可能没有得到任何好处(如果不是很流行的情况)或者使事情变得更糟(如果您意外地创建了一个“旋转锁”)。

不确定您所说的C运行时库是什么意思。语言本身,或标准库不提供任何方法来执行此操作。您需要使用特定于操作系统的库/API。另外,不要被
sig_atomic_t
所愚弄——它们并不是乍一看看上去的样子,只在信号处理程序的上下文中有用

在Windows上,有等。对于Linux,您可以使用它—它们是可移植的(请参阅)。我不知道其他操作系统的解决方案

通常,您可以在x86上使用
xchg
指令进行原子操作(也适用于双核CPU)

至于你的第二个问题,不,我不认为使用原子操作会比使用互斥更快。例如,pthreads库已经使用原子操作实现了互斥,这非常快。

早于C11 C库没有任何

在Linux上,gcc提供了一些——查找
\uuuu sync\u fetch\u和\u add
\uuuu sync\u fetch\u和\u sub
,等等

对于Windows,请查找
InterlockedIncrement
InterlockedDecrement`、
InterlockedExchange`,等等。如果在Windows上使用gcc,我想它也有与Linux上相同的内置功能(尽管我还没有验证)

在Solaris上,这将取决于。假设您使用gcc,它可能(再次)具有与Linux下相同的内置功能。除此之外,还有很多图书馆,但没有真正的标准化

C11 C11增加了一套(合理的)完整的原子操作和原子类型。这些操作包括
atomic\u fetch\u add
atomic\u fetch\u sum
(和
*\u explicit
版本,它们允许您指定所需的排序模型,其中默认的总是使用
内存顺序
)。还有
围栏
功能,如
原子线程围栏
原子信号围栏


这些类型对应于每个普通整数类型——例如,对应于
int8\u t
atomic\u int8\u t
和对应于
uint\u least64\u t
。这些是在
中定义的
typedef
名称。为避免与任何现有名称冲突,可以省略标题;编译器本身在实现者的名称空间中使用名称(例如,
\u Atomic\u uint\u least32\u t
而不是
Atomic\u uint\u least32\u t
)。

在所有受支持的平台上,都可以使用。在内置原子操作的平台上(如组装指令),glib将使用它们。在其他平台上,它将退回到使用互斥锁

我认为原子操作可以提高速度,即使互斥体是使用原子操作实现的。使用互斥锁,您将至少有两个原子操作(锁定和解锁),加上实际操作。如果atomic op可用,那么它只是一个操作。

synch_fetch_和*可以很好地跨任何可以承载gcc的主机进行移植,ARM除外+1.