std::atomic のストアが逐次一貫性のために XCHG を採用する理由
x86 および x86_64 アーキテクチャの std::atomic のコンテキストでは、逐次一貫性のあるストア操作 (std::memory_order_seq_cst) を採用順次リリース セマンティクスを実現する手法として、メモリ バリアを備えた単純なストアの代わりに XCHG を使用します。
順次一貫性と xchg
順次一貫性により、すべてのメモリ操作が表示されるようになります。ある順番で実行され、この順序はすべてのスレッドで同じです。 XCHG は 2 つのオペランドの値をアトミックに交換する x86 命令であり、本質的にこの逐次一貫性要件を満たします。 XCHG を使用して書き込み操作を実行することにより、std::atomic は、実行順序の特定の時点でストアがすべてのスレッドにグローバルに認識されるようにし、後続の操作による並べ替えを防ぎます。
mov- store mfence vs. XCHG
一方、単純な mov-store に続いてメモリ フェンス (mfence など) を使用する場合、理論的にはリリース セマンティクスを提供しますが、順次リリースのストア操作には十分ではありません。メモリ バリアを確立するメモリ フェンス命令である MFENCE は、続行する前に以前の書き込み操作がメモリにコミットされていることを確認します。ただし、後続のロード操作がストアのリリース前に再順序付けされるのを防ぐことはできません。
パフォーマンスに関する考慮事項
順次リリースのための mov-store mfence と XCHG の選択ストア操作にはパフォーマンスのトレードオフが伴います。
実装の詳細
実際には、逐次一貫性を備えた std::atomic ストアの具体的な実装は、コンパイラとハードウェア アーキテクチャによって異なります。
Implicit Acquire Fence
x86 ストアに暗黙的取得フェンスがあるという記述は正しくありません。 x86 上のストアには、取得セマンティクスではなくリリース セマンティクスがあります。取得セマンティクスは通常、mfence などのメモリ バリアや std::memory_order_acquire セマンティクスによるアトミック読み取り操作を使用して強制されます。
以上が`std::atomic` のストアが x86 での逐次一貫性のために XCHG を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。