Linux上的C中的原子操作

cha*_*e55 5 c linux gcc atomic

我正在尝试将我从Mac OS X编写的一些代码移植到Linux上,并且很难找到适合OSX的替代品OSAtomic.h.我找到了gcc __sync*系列,但我不确定它是否与我的旧编译器/内核兼容.我需要在GCC v4.1.2和内核2.6.18上运行代码.

我需要的具体操作是:

  • 增量
  • 递减
  • 比较和交换

有点奇怪的是,locate stdatomic.h在linux机器上运行会找到头文件(在c ++目录中),而在我的OSX机器上运行相同的命令(gcc v4.6.3)则不会返回任何内容.我需要安装什么来获取stdatomic库,它是否适用于gcc v 4.1.2?

作为旁注,我不能使用任何第三方库.

Kri*_*oks 5

好吧,没有什么可以阻止你OSAtomic在其他平台上使用操作.OSAtomicARM,x86和PPC的操作源是Apple的libc的一部分,它是opensource.请确保您没有使用OSSpinLockMac 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


Geo*_*edy 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);
Run Code Online (Sandbox Code Playgroud)

它还包含细粒度的内存屏障(即读取,写入和读取/写入),而不仅仅是完整的内存屏障.

主头文件已经显示,在库中可用的操作注释.