【问题标题】:atomic variables in CC中的原子变量
【发布时间】:2011-03-22 15:15:10
【问题描述】:

我想在 C 中使用原子变量。

我在 gcc 中尝试了以下建议的内置函数,但收到链接错误 undefined reference to `_sync_fetch_and_add'

  type __sync_fetch_and_add (type *ptr, type value);
  type __sync_fetch_and_sub (type *ptr, type value);
  type __sync_fetch_and_or (type *ptr, type value);
  type __sync_fetch_and_and (type *ptr, type value);
  type __sync_fetch_and_xor (type *ptr, type value);
  type __sync_fetch_and_nand (type *ptr, type value);

我假设我的架构不支持它们。我想这可能是因为它不是英特尔,而是查看 CPU 信息,我发现我有英特尔 CPU。

  >less /proc/cpuinfo

  processor       : 0
  vendor_id       : GenuineIntel
  cpu family      : 6
  model           : 26
  model name      : Intel(R) Xeon(R) CPU           X5570  @ 2.93GHz
  stepping        : 5
  cpu MHz         : 1600.000



   >uname -a
   Linux xxxxxx 2.6.24.7-108.el5rt #1 SMP PREEMPT RT 
   Mon Mar 23 10:58:10 EDT 2009      x86_64 x86_64 x86_64 GNU/Linux

您是否知道其他可能为我的架构实现原子变量的方法或库,或者我是否做错了什么(也许我应该检查一些编译标志)?

注意:我找到了stdatomic.h,但不幸的是仅适用于 C++

使用示例:

int i =0;
i = _sync_fetch_and_add (&i,2);

【问题讨论】:

  • 您能展示一下您是如何使用这些功能的吗?看起来您在函数名称 __sync_XXX 中缺少两个下划线。
  • 嗯,我觉得有点愚蠢,因为现在它编译没有问题。你是对的..我错过了第一个下划线..:(
  • 没问题,每个人都可以偶尔用第二双眼睛:)

标签: c multithreading atomic


【解决方案1】:

这个答案将在 201X 年变得相关。 :-)

即将推出的 C1X 标准将原子作为 C 语言功能引入。 请参阅draft C1X standard

【讨论】:

  • :) 我什至不知道 C 与它的 C1X 版本相比也是如此。去年我个人只关注 C++ 和 C++0x,我什至可以相信 C 也会进步。感谢您的更新。
【解决方案2】:

尝试使用 -march 命令行选项,原子内置并非适用于所有目标架构。 See also

【讨论】:

  • +1 特别考虑使用-march=native。如果你的 gcc 版本不支持这个,这很好地表明它太旧了。 AFAIR 版本高达 4.2 左右有点困难,因为当他们不实现这些东西时,它们只是让符号未定义。
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多