複数のスレッドが共有グローバル変数に同時にアクセスする場合、スレッドは次のコマンドを使用して変数に書き込み、または変数から読み取ることがあります。異なるコピーは異なるプロセッサ コアにキャッシュされます。異なるキャッシュに格納されている値の間に潜在的な不一致があるため、1 つのスレッドがそのキャッシュから古い値を読み取る可能性があります。
ただし、C 11 標準ではアトミック操作用の std::atomic ライブラリが提供されています。 、最新の値が他のキャッシュから確実に読み取られるようにします。これは、あるスレッドによって行われた変更が他のスレッドにも一貫した順序で表示されることを保証する、強力なメモリ順序付けによって実現されます。一方、 volatile キーワードは、単に変数が次の方法で最適化されるべきではないことを示します。ただし、アトミック アクセスは保証されません。これは主に、メモリ マップされた I/O や信号処理などのシナリオ向けに設計されています。
次のようなスレッド間の共有変数のコンテキストでは:
std::atomic
std::atomicai;
一方、std::atomic 型は、std::memory_order_seq_cst などのさまざまなオプションを通じてメモリの順序付けを提供します。これにより、すべての変数にわたるすべてのアトミック操作に対して単一の合計順序が強制されます。これにより、可視性と順序付けの制約が確実に維持され、スレッドが厳密に定義された順序で古い値を監視することがなくなります。
さらに、exchange()、compare_exchange_strong()、fetch_add などの読み取り、変更、書き込み操作を使用します。 () は最新の値へのアクセスを保証します。同じスレッド コンテキスト内でこれらの操作を実行することにより、スレッドは更新された値を正しい順序で監視し、不一致を回避します。
アトミック操作を使用するには、慎重な検討と理解が必要です。実稼働コードにアトミックオペレーションを効果的に実装するには、背景資料と既存のコードを徹底的に調査することをお勧めします。多くの場合、アトミック操作の課題が必要ない場合、ロックは実行可能な代替手段となります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3