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

标签 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

最佳答案

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

关于c++ - clang 是否支持双字比较和交换操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432978/

相关文章:

c - 为什么在 glibc libc-lock.h 中使用三个 *?

windows - Clang 相当于 GCC 的 -mwindows

c++ - IBM Bluemix 树莓派发送传感器数据

python - OpenCV 3.1 绘制轮廓 '(-215) npoints > 0'

c++ - 奇怪的算法性能

c++ - 为什么 AddVector CUDA c++ 不起作用?

linux - 从 linux 交叉编译到 ARM-ELF (ARM926EJ-S/MT7108)

gcc - FASM:从 GCC 调用切线

c++ - clang 上的模棱两可的运算符重载

c - 当 -mavx2 打开时为 __builtin_popcount 生成臃肿的代码