2013-08-25 26 views
3

我一直在閱讀並編寫安東尼威廉姆斯的書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 
+1

大多數系統提供這種東西。爲什麼你想/需要依賴編譯器功能? – Macmade

+0

您可以隨時使用內聯彙編程序 – PlasmaHH

+0

@Macmade GCC 4.8和Clang 3.3都不會在沒有標誌的情況下鏈接我的代碼。我會用最小的代碼示例更新這個問題 – jbcoe

回答

1

ReferenceCountedPointer是可以複製的,所以代碼在C++ 11下是有效的。顯然,圖書館不符合標準。

+0

它看起來像libC++和libstdC++不足。兩人都抱怨失蹤的符號。 – jbcoe

+0

我的印象是,即使沒有雙字比較交換,我的代碼也會編譯和鏈接,但會使用互斥鎖,而不是鎖定空閒。這似乎與你所說的一致。 – jbcoe

+1

@PeteBecker:我不完全確定你想說什麼。爲了比較和交換具有一個指針和一個整數的數據結構,在一個64位體系結構中,需要一個16字節的比較交換操作 - 否則,它不會是原子的。當然,人們可以在它周圍編寫一些「互斥鎖」或類似的鎖,但我不認爲這符合原子的技術定義。或者我錯過了什麼? –

5

這裏的問題是某些型號的64位處理器沒有cmpxchg16b-mcx16告訴編譯器「我知道這個處理器支持cmpxchg16b指令,所以你可以生成它」。這是爲了避免舊版64位處理器不支持該指令的問題 - 它們會導致「非法操作碼陷阱」。這與使用SSE4相同。