ホームページ >バックエンド開発 >C++ >1 つのスレッドが C11 アトミック変数から古いデータを読み取ることはできますか?

1 つのスレッドが C11 アトミック変数から古いデータを読み取ることはできますか?

DDD
DDDオリジナル
2024-12-13 17:53:10304ブラウズ

Can One Thread Read Stale Data from a C  11 Atomic Variable?

同時実行性: C 11 メモリ モデルのアトミックと揮発性を理解する

異なるコアで同時に実行されている複数のスレッドによってアクセスされるグローバル変数を考えてみましょう。各スレッドは変数への書き込みと変数からの読み取りの両方ができます。 1 つのスレッドがアトミック変数から古い情報を読み取ることはできますか?

Volatile と Atomic: 違い

atomic はアトミック アクセスを意味しますが、volatile だけではアトミック アクセスは意味しません。 Volatile は、メモリマップされた I/O や信号処理などの状況で使用されます。 std::atomic と組み合わせると冗長になります。さらに、アトミック アクセスやスレッド間のメモリ順序とは無関係です。

アトミック変数によるメモリ順序付け

C 11 の std::atomic ライブラリは、アトミック整数型、

 std::atomic<int>;あい; 

可視性とシーケンスの制限は、オペレーションに指定されたメモリ順序によって異なります。
  • シーケンス一貫性のある順序付け (std::memory_order_seq_cst): すべてのオペレーションの単一の合計順序を維持します。すべての変数。古い値が存在しないことは保証されませんが、取得された値が順序付けにおける操作の位置によって決定され、決定されることは保証されます。
  • 緩和順序付け (std::memory_order_relaxed): 順序付けを削除します。制約があり、最適な速度を実現できますが、予測できない実行の危険がありますorder.

読み取り-変更-書き込み (RMW) オペレーション: 鮮度の保証

Exchange()、compare_exchange_strong()、fetch_add( などの RMW オペレーション) )、保証を提供します。常に最新の値に基づいて動作します。複数のスレッドからの ai.fetch_add(1) への一連の呼び出しでは、重複した番号や欠落した番号は返されません。ただし、スレッドは異なる時点で値を参照する可能性があります。

注意と結論

アトミック操作を理解することが重要です。実稼働コードで使用する前に、徹底的な調査とコードのレビューを行うことをお勧めします。多くの場合、ロックは、よりアクセスしやすく、ほぼ同じ効率の同時実行アプローチを提供します。

以上が1 つのスレッドが C11 アトミック変数から古いデータを読み取ることはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。