在Linux上使用C语言的原子操作

5
我正在尝试将我写的一些代码从Mac OS X移植到Linux,并且很难找到适合OSX唯一使用的OSAtomic.h的替代品。我发现了gcc的__sync*系列,但是我不确定它是否与我拥有的旧编译器/内核兼容。我需要在GCC v4.1.2和内核2.6.18上运行该代码。
我需要的特定操作是:
  • 增量
  • 减量
  • 比较和交换
奇怪的是,在Linux机器上运行locate stdatomic.h会发现头文件(在C++目录中),而在我的OSX机器上(gcc v4.6.3)运行相同的命令则没有结果。我需要安装什么才能获得stdatomic库,并且它能够与gcc v 4.1.2一起使用吗?
顺便说一下,我不能使用任何第三方库。

1
GCC原子内建函数的文档是作为4.1.1的一部分进行记录的。 - jxh
类似于增量和获取操作,并且没有GCC版本要求:https://dev59.com/-HE95IYBdhLWcg3wV8a_ - Ciro Santilli OurBigBook.com
3个回答

6

好的,没有任何东西能阻止您在其他平台上使用OSAtomic操作。 ARM、x86和PPC的OSAtomic操作源码是苹果的libc的一部分,该库是开源的。只需确保不使用OSSpinLock,因为它是专门针对Mac OS X的,但是这可以很容易地用Linux futexes替换。

请参见以下内容:

http://opensource.apple.com/source/Libc/Libc-594.1.4/i386/sys/OSAtomic.s http://opensource.apple.com/source/Libc/Libc-594.1.4/ppc/sys/OSAtomic.s http://opensource.apple.com/source/Libc/Libc-594.1.4/arm/sys/OSAtomic.s

另外,您可以使用sync_*系列,我相信这应该适用于大多数平台,在这里描述:http://gcc.gnu.org/wiki/Atomic


5

OpenPA 项目 提供了一个 MIT 风格许可的便携式原子操作库。这是我以前使用过的一个库,非常简单明了。你的操作代码将类似于

#include "opa_primitives.h"

OPA_int_t my_atomic_int = OPA_INT_T_INITIALIZER(0);

/* increment */
OPA_incr_int(&my_atomic_int);

/* decrement */
OPA_decr_int(&my_atomic_int);

/* compare and swap */
old = OPA_cas_int(&my_atomic_int, expected, new);

它还包含了细粒度的内存屏障(即读、写和读/写),而不仅仅是完整的内存屏障。 主头文件中有一条注释,显示了库中可用的操作。

4

GCC原子内置函数自GCC 4.0.1版本起已经可用。

没有任何阻止你使用GCC 4.1.2构建GCC 4.7或Clang,然后获得所有新功能,例如C11原子操作

作为最后手段,有许多位置可以找到基于BSD许可的汇编实现的原子操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接