使用gcc原子内置?

时间:2012-12-18 20:57:32

标签: c gcc gnu atomic

我正在尝试使用__atomic_load_n atomic builtins页面中的gcc,并使用

进行编译
gcc -Wall -march=i686 -std=gnu99 ll.c -o ll

但它告诉我它不能

  

警告:隐式声明函数'__atomic_load_n'

我认为向gcc提供archmarch标志就足够了(并通过设置std=gnu99标志确保),但无济于事。事实上,即使我测试常见的__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);
}

1 个答案:

答案 0 :(得分:15)

直到GCC 4.6.3,原子操作的编译器内置函数是纯编译器扩展,在GCC中,它们被分组到__sync_*函数族。

从版本4.7.0开始,新的C ++ 11和C11标准都已完成,GCC更新了它们的原子内置函数,以更好地反映这两种新语言修订版的新内存模型。新功能分为__atomic_*系列。

但是,较旧的内置插件为still availabledocumentation表示:

  

使用__sync内存模型通过__atomic调用替换__ATOMIC_SEQ_CST来电是始终安全。