【发布时间】:2016-04-07 08:36:16
【问题描述】:
我正在尝试验证我是否可以在我拥有的 gcc 编译器(版本 4.3.2)中使用“__atomic_exchange_n”,如果它支持原子,我找不到任何地方,如果它不可以使用“__sync_lock_test_and_set” ?
我在哪里可以看到我的编译器是否支持这些函数,或者它们何时在 gcc 中引入?谢谢!
伪代码:
#if defined HAVE_GCC_SYNC_BUILTINS
#define AtomicExchange(vP, v) (void)__sync_lock_test_and_set(vP, v)
#elif defined HAVE_GCC_ATOMIC_BUILTINS
#define AtomicExchange(vP, v) (void)__atomic_exchange_n(vP,v, o)
#endif
编辑:
我有 gcc 4.3.2,我无法更新它。 (平台限制) 有没有办法实现 64 位变量的原子存储?
我尝试使用上面所说的“__sync_lock_test_and_set(vP, v)”,对于 int、short 和 char 它有效,但对于 int64(long long),我可以执行存储,因为它给出了“未定义的引用到 __sync_lock_test_and_set_8"。 “_8”是 8 字节(64 位)。
我可以做些什么来实现 64 位原子存储? 谢谢
【问题讨论】:
-
预处理器指令前的前导下划线是什么?我假设它们在真实代码中不存在?
-
只是为了识别代码*
-
能说说CPU架构吗?来自
/proc/cpuinfo的vendor_id和model name,或uname -m -p,或者您在交叉编译到该架构时使用的设置?某些架构(如 ARM 变体)具有不同的比较和交换/测试和设置操作方法。尽管所有内置插件都可以工作,但其中一些工作得更好(也就是说,速度更快,内部循环的迭代次数更少,等等)。如果我了解架构,我可以展示一些示例案例。 -
@NominalAnimal cpu 架构各不相同,但通常它是 32 位的 powerpc,但 gcc 4.3.2 表示:“未定义对 __sync_lock_test_and_set_8 的引用”用于 64 位变量。谢谢。