我一直在閱讀並編寫安東尼威廉姆斯的書Concurrency in Practice的示例,並需要使用-mcx16
爲gcc4.8啓用雙字比較和交換,以便包含int指針的結構可以在無鎖原子方式。Clang是否支持雙字比較和交換操作?
Clang(任何版本)是否支持x64上的雙字比較和交換?
下面的代碼提供鏈接在GCC4.8和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;
}
上述程序是沒有意義的,但說明了鏈接錯誤我明白了。
我用於鏘和GCC編譯命令是:
鏘3.3:
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
失敗
clang++-mp-3.3 -std=c++11 -stdlib=libc++ 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
您可以隨時使用內聯彙編程序 – PlasmaHH
@Macmade GCC 4.8和Clang 3.3都不會在沒有標誌的情況下鏈接我的代碼。我會用最小的代碼示例更新這個問題 – jbcoe