我一直在阅读并编写Anthony Williams的书" Concurrency in Practice "中的示例,并且需要为gcc4.8启用双字比较和交换,-mcx16以便包含指针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;
}
Run Code Online (Sandbox Code Playgroud)
上面的程序毫无意义,但说明了我看到的链接错误.
我用于Clang和GCC的编译命令是:
Clang 3.3:
clang++-mp-3.3 -std=c++11 -stdlib=libc++ CX16.cpp -o CX16
Run Code Online (Sandbox Code Playgroud)
失败:
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
Run Code Online (Sandbox Code Playgroud)
GCC4.8:
g++-mp-4.8 -std=c++11 CX16.cpp -o CX16
Run Code Online (Sandbox Code Playgroud)
失败:
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
Run Code Online (Sandbox Code Playgroud)
这里的问题是64位处理器的某些型号没有cmpxchg16b.该-mcx16告诉编译器:"我知道,这个处理器支持cmpxchg16b说明,这样你就可以生成它." 这是为了避免不支持此指令的旧64位处理器出现问题 - 然后它们会导致"非法操作码陷阱".这与使用例如SSE4相同.
| 归档时间: |
|
| 查看次数: |
1318 次 |
| 最近记录: |