Std::atomic_thread_fence有未定义的引用

std::atomic_thread_fence has undefined reference

本文关键字:未定义 引用 thread atomic Std fence      更新时间:2023-10-16

在Ubuntu 12.04系统上,当我尝试编译以下代码时:

#include <atomic>
int a;
int main()
{
  a = 0;
  std::atomic_thread_fence(std::memory_order_acquire);
  a = 1;
}

得到如下错误信息:

g++ test.cpp -std=c++0x 
/tmp/ccayKntC.o: In function `main': test.cpp:(.text+0x14): undefined reference to `std::atomic_thread_fence(std::memory_order)' collect2: ld returned 1 exit status

在使用clang++编译时也会发生这种情况。由于这是一个链接器错误,我猜我的libstdc++版本缺乏必要的功能。然而,其他原子操作似乎可以工作。

我正在使用Ubuntu 12.04。我想知道我的系统设置是否有问题,是否缺少libstdc++的功能,或者可能是其他东西。理想情况下,我希望能够解决这个问题。

这实际上是一个在4.7分支中修复的错误:

  • http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51038

我想你应该用__sync_synchronize或者__asm__ __volatile__ ( "mfence" ::: "memory" )之类的

有些人喜欢对他们需要的同步操作非常严格,但我认为一直使用mfence对于常见情况就足够了。