x86では、操作load()
とstore()
メモリ バリアmemory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel
にキャッシュとパイプライン用のプロセッサ命令は必要なく、アセンブラのコードは常に に対応しstd::memory_order_relaxed
、これらの制限はコンパイラの最適化にのみ必要であることが知られています。 stdthread.co.uk/forum/index.php?topic=72.0
そして、このコードの逆アセンブリ コードは、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) は単純なストア命令にドロップされます。
Anthony Williams が言ったstd::memory_order_acquire
ように、x86/x86_64 のプロセッサ命令lock cmpxchg
または単純なロード命令のみが必要ですか?mov
回答:次のバグ レポートと同じです: http://connect.microsoft.com/VisualStudio/feedback/details/770885