Anthony Williams の著書Concurrency in Practice-mcx16
の例を読んでコーディングしており、int ポインターを含む構造体をロックで操作できるように、gcc4.8 を使用して double-word-compare-and-exchange を有効にする必要がありました。 -無料のアトミックな方法。
Clang (任意のバージョン) は x64 で double-word-compare-and-exchange をサポートしていますか?
次のコードは、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 で使用したコンパイル コマンドは次のとおりです。
クラン 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