キャッシュやパイプラインのためのプロセッサ命令を必要としないmemory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel
操作load()
とstore()
メモリバリアのためのx86、およびアセンブラのコードに常にstd::memory_order_relaxed
に対応し、これらの制限は、唯一の最適化のために必要であることが知られていますコンパイラ:http://www.stdthread.co.uk/forum/index.php?topic=72.0`std :: memory_order_acquire`のセマンティクスにはx86/x86_64のプロセッサ命令が必要ですか?
そして、このコードの逆アセンブルコードがstore()
(MSVS2012 x86_64版)のためにこれを確認:
std::atomic<int> a;
a.store(0, std::memory_order_relaxed);
000000013F931A0D mov dword ptr [a],0
a.store(1, std::memory_order_release);
000000013F931A15 mov dword ptr [a],1
しかし、使用してload()
(MSVS2012 x86_64版)のためにこれをしないかご確認くださいこのコード、lock cmpxchg
:
int val = a.load(std::memory_order_acquire);
000000013F931A1D prefetchw [a]
000000013F931A22 mov eax,dword ptr [a]
000000013F931A26 mov edx,eax
000000013F931A28 lock cmpxchg dword ptr [a],edx
000000013F931A2E jne main+36h (013F931A26h)
std::cout << val << "\n";
some_atomic.load(STD :: memory_order_acquireは)ちょうどん 単純なロード命令と some_atomic.store(std :: memory_order_release)が単純なに分岐しますストア命令。
どこが間違っている、とアンソニー・ウィリアムズが言ったようにstd::memory_order_acquire
のセマンティクスは、x86/x86_64のlock cmpxchg
または単純なロード命令mov
上のプロセッサ命令を必要としていますか?
ANSWER:それは、このバグレポートと同じです:http://connect.microsoft.com/VisualStudio/feedback/details/770885
コンパイラが生成するものを見ても、特定の機能の要件を判断するためには必ずしも良い方法ではないかと思っています。コンパイラが「必要以上に」行っていることはあまりありません。 –
@Mats Peterssonはい、何もしないよりも簡単なことはありません。そして、それはコンパイラから必要とされたもので、 'mov'だけでした。実際、マイクロソフトの開発者はこれを最も単純なタスク、「何もしない」で失敗しましたか? :) – Alex
私はMSのVC(少なくともいくつかのバージョン)は、 "volatile"と宣言された変数に余分な "ロック"を生成することを知っています - C++の標準では必要ではなく、 SMPシステムを使用するとうまく動作しません。これらの状況の1つに似ています。 –