memory_order_relaxed で確認しながら、停止フラグ設定にmemory_order_seq_cst を使用する理由
Herb Sutter は、アトミック操作に関する議論の中で、使用例を示しています。停止フラグメカニズムを含むアトミックの構成:
ワーカースレッドは継続的に停止フラグをチェックします:
while (!stop.load(std::memory_order_relaxed)) { // Do stuff. }
ストア操作で Relax を使用しない理由
Herb は、レイテンシの懸念が最小限に抑えられるため、フラグのチェックにmemory_order_relaxed を使用することは許容されると示唆していますが、たとえレイテンシが優先されていたとしても、より厳密なメモリ順序を採用しても目立ったパフォーマンス上の利点はありません。
使用しない理由おそらく見落としや個人的な好みが原因で、ストアの運営で Relax を使用するかどうかは不明のままです。
レイテンシーに関する考慮事項
ISO C 標準では、ストアの可視性について特定の時間枠を強制していませんまたはそれに影響を与える方法についてのガイダンスを提供します。これらの規定は、緩和されたものを含むすべてのアトミック操作に適用されます。ただし、実装では、妥当な時間枠内でアトミック ロードにストア値にアクセスできるようにすることが推奨されます。
実際には、ハードウェア キャッシュ コヒーレンス メカニズムにより、通常、最良の場合でも数十ナノ秒以内の可視性が可能であり、具体的なレイテンシーは実装によって決まります。
メモリ順序の影響
ストアまたはロード操作の異なるメモリ順序は、実際にはストアを促進しません
本質的に、より強力な命令と障壁はイベントを絶対に加速するわけではなく、ストアまたはロードが完了するまで他の操作を延期します。これは、他のコアからストアを即座に認識できるようにするすべての現実世界の CPU に当てはまります。
したがって、seq_cst を使用するなどメモリ順序を増やすと、停止フラグへの変更がワーカーに即座に認識されるようになります。スレッドを保護し、迅速なシャットダウンを保証します。ただし、実際の可視性のレイテンシには影響しません。
リラックスしたチェックの利点
チェック操作にmemory_order_relaxedを使用すると、次のような利点があります。
追加の考慮事項
Herb は、thread.join によって提供される同期により、ダーティ フラグに Relax の使用も許容されることを正しく認識します。ただし、ダーティには同じ値の同時書き込みを防ぐためのアトミック性が必要であることに注意してください。これは ISO C 標準では依然としてデータ競合とみなされます。
結論として、停止フラグの設定に Memory_order_seq_cst を使用すると、即時性が確保されます。ワーカー スレッドへの可視性が低下するため、ロード操作のために過度に緩和してもパフォーマンス上の利点はありません。 Memory_order_relaxed は、命令レベルの並列処理とメモリ帯域幅の使用率の点で利点があり、このようなシナリオでは推奨される選択肢となります。
以上が停止フラグの設定には「memory_order_seq_cst」を使用し、チェックには「memory_order_relaxed」を使用するのはなぜでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。