我正试图将我从Mac编写的一些代码移植到Linux上,并且很难找到一个合适的替代品来替代OSX专用的OSAtomic.h。我找到了gcc __sync*家族,但我不确定它是否与我所拥有的老版本的编译器/内核兼容。我需要代码在GCC版本4.1.2和内核2.6.18上运行。
我需要的具体行动是:
奇怪的是,在linux机器上运行locate stdatomic.h会找到头文件(在c++目录中),而在我的OSX机器上运行相同的命令(gcc v4.6.3)却什么也不返回。我需要安装什么才能得到stdatomic库,并且它能与gcc诉4.1.2一起工作吗?
顺便提一句,我不能使用任何第三方库。
发布于 2012-08-23 01:54:55
好吧,没有什么可以阻止您在其他平台上使用OSAtomic操作。ARM、x86和PPC的OSAtomic业务来源是苹果开放资源libc的一部分。只需确保您没有使用OSSpinLock,因为这是Mac特有的,但是这可以很容易地被Linux替换。
见以下内容:
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-23 02:13:38
OpenPA项目在麻省理工学院风格的许可下提供了一个可移植的原子操作库.这是我以前用过的,而且很简单。您的操作代码如下所示
#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-23 02:29:49
GCC原子的本质自GCC 4.0.1以来就已经存在了。
没有什么能阻止您用GCC 4.1.2构建GCC 4.7或Clang,然后获得所有更新的特性,比如C11原子。
有许多地方,您可以找到BSD许可的组装器实现的原子作为最后手段。
https://stackoverflow.com/questions/12083694
复制相似问题