clang是否支持双字比较和交换操作?

时间:2013-08-25 19:44:33

标签: c++ gcc clang

我一直在阅读并编写Anthony Williams的书Concurrency in Practice中的示例,并且需要使用-mcx16为gcc4.8启用双字比较和交换,以便包含结构指针int可以以无锁原子方式操作。

Clang(任何版本)是否支持x64上的双字比较和交换?

以下代码给出了GCC4.8和Clang 3.3中的链接错误,没有额外的编译器选项:

#include <atomic>
#include <thread>

struct ReferenceCountedPointer
{
  int referenceCount;
  void* data;
};

int main()
{
  std::atomic<ReferenceCountedPointer> arcp;
  ReferenceCountedPointer rcp;

  arcp.compare_exchange_weak(rcp, rcp);

  return 0;
}

上述程序毫无意义,但说明了我看到的链接错误。

我用于Clang和GCC的编译命令是:

Clang 3.3:

clang++-mp-3.3 -std=c++11 -stdlib=libc++ CX16.cpp -o CX16

失败:

Undefined symbols for architecture x86_64:
"___atomic_compare_exchange", referenced from:
  _main in CX16-plVSvq.o
ld: symbol(s) not found for architecture x86_64

GCC4.8:

g++-mp-4.8 -std=c++11 CX16.cpp -o CX16

失败:

Undefined symbols for architecture x86_64:
"___atomic_compare_exchange_16", referenced from:
  std::atomic<ReferenceCountedPointer>::compare_exchange_weak(ReferenceCountedPointer&,        ReferenceCountedPointer, std::memory_order, std::memory_order) in ccOjp95s.o
ld: symbol(s) not found for architecture x86_64

2 个答案:

答案 0 :(得分:5)

这里的问题是64位处理器的某些型号没有cmpxchg16b-mcx16告诉编译器“我知道这个处理器支持cmpxchg16b指令,所以你可以生成它”。这是为了避免使用不支持此指令的旧64位处理器出现问题 - 然后它们会导致“非法操作码陷阱”。这与使用例如SSE4相同。

答案 1 :(得分:1)

ReferenceCountedPointer可以轻松复制,因此代码在C ++ 11下有效。显然,图书馆不符合标准。