4

私は C++11 のstd::memory_order型 (リラックス、取得リリース、逐次一貫など) の概念を十分に理解していますが、x86 で (コンパイラによって) 通常どのように実装されているかをよりよく理解したいと思っています (または x86_64) ターゲット。

memory_order_consume具体的には、各順序制約 ( 、memory_order_acquirememory_order_release、および)の低レベルの詳細 (プロセッサ間の状態またはキャッシュを同期するための重要なメモリ関連の CPU 命令など) の比較memory_order_seq_cst

できればx86_64または同様のアーキテクチャについて、できるだけ低レベルの詳細を提供してください。あなたの助けは非常に高く評価されます。

4

2 に答える 2

6

x86 および x86_64 では、アトミックを使用しなくても、ロードには取得セマンティクスがあり、ストアにはリリース セマンティクスがあるため、例外を除くすべてのメモリ順序seq_cstで特別な命令はまったく必要ありません。

完全な順序の一貫性を得るために、コンパイラはmfence命令を挿入して、異なるメモリ位置での操作の並べ替えを防ぐことができますが、他の特別な命令は必要ないと思います。

コンパイラは、アトミック操作間でロードとストアを移動することを避ける必要がありますが、これは純粋にコンパイラ オプティマイザの制限であり、CPU 命令を発行する必要はありません。

良い情報については、http://www.stdthread.co.uk/forum/index.php?topic=72.0を参照してください。

于 2013-05-29T14:01:54.747 に答える