我一直在阅读安东尼威廉姆斯( Anthony )的书“实践中的并发性”中的例子并对其进行编码,需要使用-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_64GCC4.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发布于 2013-08-25 20:07:58
ReferenceCountedPointer在很小程度上是可以复制的,因此在C++11下代码是有效的,显然库不符合标准。
发布于 2013-08-25 19:53:42
这里的问题是,有些64位处理器的模型没有cmpxchg16b。-mcx16告诉编译器“我知道这个处理器支持cmpxchg16b指令,所以您可以生成它”。这是为了避免旧的64位处理器出现不支持此指令的问题--然后它们会导致“非法操作码陷阱”。例如,它与使用SSE4是一样的。
https://stackoverflow.com/questions/18432978
复制相似问题