同時実行性: C 11 メモリ モデルのアトミックと揮発性を理解する
異なるコアで同時に実行されている複数のスレッドによってアクセスされるグローバル変数を考えてみましょう。各スレッドは変数への書き込みと変数からの読み取りの両方ができます。 1 つのスレッドがアトミック変数から古い情報を読み取ることはできますか?
Volatile と Atomic: 違い
atomic はアトミック アクセスを意味しますが、volatile だけではアトミック アクセスは意味しません。 Volatile は、メモリマップされた I/O や信号処理などの状況で使用されます。 std::atomic と組み合わせると冗長になります。さらに、アトミック アクセスやスレッド間のメモリ順序とは無関係です。
アトミック変数によるメモリ順序付け
C 11 の std::atomic ライブラリは、アトミック整数型、
std::atomic<int>;あい;
読み取り-変更-書き込み (RMW) オペレーション: 鮮度の保証
Exchange()、compare_exchange_strong()、fetch_add( などの RMW オペレーション) )、保証を提供します。常に最新の値に基づいて動作します。複数のスレッドからの ai.fetch_add(1) への一連の呼び出しでは、重複した番号や欠落した番号は返されません。ただし、スレッドは異なる時点で値を参照する可能性があります。
注意と結論
アトミック操作を理解することが重要です。実稼働コードで使用する前に、徹底的な調査とコードのレビューを行うことをお勧めします。多くの場合、ロックは、よりアクセスしやすく、ほぼ同じ効率の同時実行アプローチを提供します。
以上が1 つのスレッドが C11 アトミック変数から古いデータを読み取ることはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。