我正在尝试将我从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?
作为附注,我不能使用任何第三方库。
答案 0 :(得分:5)
好吧,没有什么可以阻止你在其他平台上使用OSAtomic
操作。 ARM,x86和PPC的OSAtomic
操作源是Apple的libc的一部分,它是opensource。只是确保你没有使用{1}}特定于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
或者,您可以使用我认为应该在大多数平台上使用的OSSpinLock
系列,我认为这些系列在此处有所描述:http://gcc.gnu.org/wiki/Atomic
答案 1 :(得分:5)
OpenPA project在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);
它还包含细粒度的内存屏障(即读取,写入和读取/写入),而不仅仅是完整的内存屏障。
main header file有一条注释,显示库中可用的操作。
答案 2 :(得分:4)
自GCC 4.0.1以来,已有GCC原子内在函数可用。
没有什么可以阻止您使用GCC 4.1.2构建GCC 4.7或Clang,然后获取所有较新的功能,例如C11 atomics。
有许多地方你可以找到原子能的BSD许可汇编程序实现作为最后的手段。