使用gcc原子内置函数?

10

我正试图使用 gcc原子内置函数页面中的__atomic_load_n,并使用以下编译器:

gcc -Wall -march=i686 -std=gnu99 ll.c -o ll

但它告诉我它无法执行

警告:隐式声明函数“__atomic_load_n”

我认为,提供archmarch标志(并通过设置std = gnu99标志确保)足以向gcc提供足够的信息,但是没有用。 实际上,即使我测试常见的__GCC_VERSION____GNUC__宏似乎也没有值...但是我的gcc安装程序非常通用,就是Ubuntu中自带的那个。

我知道我正在做一些愚蠢的事情,但我想不出来到底是什么。 我有gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3

代码看起来像这样:这是一个从未被调用过的函数,因此问题出现在编译时。

type* func(type* p) {
    type* q = __atomic_load_n (p, __ATOMIC_SEQ_CST);
}

你能展示一下出现错误的代码吗? - NPE
1
我可以编译你的代码(使用gcc 4.7.2),只要我将type定义为int。如果你怀疑编译器安装存在问题,或许可以尝试使用它构建一个非平凡但干净的项目来查看会发生什么? - NPE
@NPE:噢,好吧。看起来是重新编译gcc的时候了 :( 又要浪费一个小时。谢谢。 - Dervin Thunk
1
我相信__atomic_*函数是在4.7版本中添加的。之前的版本有__sync_*函数,其功能类似。 - Kerrek SB
正如@KerrekSB所说,这是在GCC 4.7中引入的。请查看GCC 4.6.3文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/ - Yann Droneaud
显示剩余3条评论
1个回答

19

在GCC 4.6.3之前,编译器内置的原子操作仅是编译器扩展,并且在GCC中它们被分组为__sync_*函数族。

从版本4.7.0开始,新的C++11和C11标准已经完成,GCC更新了原子内置函数,以更好地反映这两个新语言修订版的新内存模型。新函数被分成__atomic_*函数族。

但是,旧的内置函数仍然可用,并且文档指出:

始终可以使用__ATOMIC_SEQ_CST内存模型用__atomic调用替换__sync调用。


虽然__ATOMIC_SEQ_CST始终有效,但它可能会给您带来相当次优的结果,当然这取决于您CPU的内存模型。 - class stacker
谢谢,回答得很好! - Howard Shane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接