我正在尝试使用__atomic_load_n
atomic builtins页面中的gcc
,并使用
gcc -Wall -march=i686 -std=gnu99 ll.c -o ll
但它告诉我它不能
警告:隐式声明函数'__atomic_load_n'
我认为向gcc
提供arch
和march
标志就足够了(并通过设置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);
}
答案 0 :(得分:15)
直到GCC 4.6.3,原子操作的编译器内置函数是纯编译器扩展,在GCC中,它们被分组到__sync_*
函数族。
从版本4.7.0开始,新的C ++ 11和C11标准都已完成,GCC更新了它们的原子内置函数,以更好地反映这两种新语言修订版的新内存模型。新功能分为__atomic_*
系列。
但是,较旧的内置插件为still available,documentation表示:
使用
__sync
内存模型通过__atomic
调用替换__ATOMIC_SEQ_CST
来电是始终安全。