3

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
4

2 に答える 2

6

ここでの問題は、64 ビット プロセッサの一部のモデルにはcmpxchg16b. は-mcx16コンパイラに、「このプロセッサが cmpxchg16b 命令をサポートしていることを知っているので、それを生成できます」と伝えます。これは、この命令をサポートしていない古い 64 ビット プロセッサの問題を回避するためです。「不正なオペコード トラップ」が発生します。たとえばSSE4を使用するのと同じことです。

于 2013-08-25T19:53:42.173 に答える