Rust アトミックスとロック 読書メモ 第 3 章 メモリの順序付け

  1. コンピューティング効率を最適化するために、コンパイラは重大な結果を招くことなく特定の命令の実行順序を調整することがあります。
  2. リラックスしたメモリ順序は、複数のスレッド間の発生前関係をトリガーしないため、最も基本的で最高のパフォーマンスのメモリ モデルです。52 ページでは、リラックスした順序が現れる状況を示しました。
  3. 同じスレッド内では、同じアトミック変数に対する操作はシーケンシャルであると見なされますが、Page52 の例のように、同じスレッド内で複数のアトミック変数が変更される順序は、別のスレッドでは必ずしも順番通りであるとは限りません。
  4. Page54 の例は、アトミック変数の順序を変更する可能性は数多くありますが、すべてのスレッドで観察される現象は同じ順序でなければならないことを示しています。
  5. 解放シーケンスと取得シーケンスは、それぞれストア操作とロード操作に対応します。ストア操作にリリース シーケンスを使用し、ロード操作に取得シーケンスを使用すると、ストア操作のスレッドで、ストア前のすべての動作が、ロード操作が配置されているスレッドのロード操作後の動作に表示されます。詳細については、57 ページの例を参照してください。
  6. ミューテックスの実装では、解放と取得の順序でアトミック操作が使用されます。ロック操作中は、まず取得順序を使用してロックが解除されているかどうかを確認し、次に状態を「ロック」に変更します (ここでは、compare_exchange 操作を使用します)。ロックを解除する場合は、解放順序を使用して状態を「ロック解除」に変更します。詳細については、61 ページの例を参照してください。
  7. Consume-load は、依存式のいくつかの変数 (たとえば*x, array[x], table.lookup(x+1))、x にロードされた値をロードしますが、x が指す値は初期化されていません。現時点では、消費順序付けを実装するコンパイラはなく、代わりに取得順序付けを使用します。また、Rust は Ordering::Consume のメモリ順序を公開しません。
  8. Ordering::SeqCstこれは、グローバルな順次一貫性を確保しながら、取得ロードと解放ストアのすべての保証を含む、最も強力なメモリ順序モデルです。これは最も単純なメモリ順序モデルのように見えますが、ほとんどのシナリオでは従来の取得-解放順序で十分です。SeqCst では、同じ変数のストアとロードの場合、ストア前のすべての操作がロードに認識され、その逆も同様です。
  9. std::sync::atomic::fence複数のリラックスしたストアまたはリラックスしたロードの以前の関係を保証するために使用できます。68 ページの例を参照してください。

おすすめ

転載: blog.csdn.net/Mint2yx4/article/details/130710107