首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux上C语言中的原子操作

Linux上C语言中的原子操作
EN

Stack Overflow用户
提问于 2012-08-23 01:49:08
回答 3查看 10K关注 0票数 5

我正试图将我从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一起工作吗?

顺便提一句,我不能使用任何第三方库。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

票数 6
EN

Stack Overflow用户

发布于 2012-08-23 02:13:38

OpenPA项目在麻省理工学院风格的许可下提供了一个可移植的原子操作库.这是我以前用过的,而且很简单。您的操作代码如下所示

代码语言:javascript
复制
#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);

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

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

票数 5
EN

Stack Overflow用户

发布于 2012-08-23 02:29:49

GCC原子的本质自GCC 4.0.1以来就已经存在了。

没有什么能阻止您用GCC 4.1.2构建GCC 4.7或Clang,然后获得所有更新的特性,比如C11原子

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12083694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档