5

我正在尝试将我编写的一些代码从 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 一起使用吗?

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

4

3 回答 3

6

好吧,没有什么可以阻止您OSAtomic在其他平台上使用操作。ARM、x86 和 PPC的操作源OSAtomic是 Apple 开源的 libc 的一部分。只要确保你没有使用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

于 2012-08-23T01:54:55.547 回答
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);

它还包含细粒度的内存屏障(即读、写和读/写),而不仅仅是一个完整的内存栅栏。

头文件有一个注释,显示库中可用的操作。

于 2012-08-23T02:13:38.390 回答
4

GCC 原子内在函数自 GCC 4.0.1 起就可用。

没有什么可以阻止您使用 GCC 4.1.2 构建GCC 4.7或 Clang,然后获得所有新功能,例如C11 atomics

作为最后的手段,您可以在许多地方找到 BSD 许可的原子汇编器实现。

于 2012-08-23T02:29:49.210 回答