【发布时间】:2013-08-25 19:44:32
【问题描述】:
我一直在阅读并编写 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
【问题讨论】:
-
大多数系统都提供这种东西。为什么要/需要依赖编译器功能?
-
你总是可以使用内联汇编
-
@Macmade GCC 4.8 和 Clang 3.3 都不会在没有标志的情况下链接我的代码。我将使用最少的代码示例更新问题
-
@jcoe:如果您已经绑定到特定的处理器型号(范围),那么便携式在这里是相对的。
-
这显然是两个库(llvm 的 libc++ 和 gnu 的 libstdc++)中的一个错误,因为它们似乎声明了一个在加载时无法解析的方法。