ホームページ  >  記事  >  バックエンド開発  >  std::atomic<> のアトミック オブジェクトとは何ですか?

std::atomic<> のアトミック オブジェクトとは何ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-10 16:33:02516ブラウズ

What is an Atomic Object in  std::atomic<>? 
? " />

std::atomic の Atomic オブジェクトとは何ですか<>

std::atomic<> テンプレートは、同時に実行できる型を提供します未定義の動作を発生させることなく、複数のスレッドによって操作されます。

原子性of std::atomic<>

std::atomic<> の各インスタンス化は、通常の C オブジェクトとは異なり、インスタンス上での異なるスレッドによる同時操作を可能にするアトミック タイプを表します。データへの排他的アクセスを確保し、データ競合を防ぎます。

Atomic操作

アトミック オブジェクトに対して実行される操作は、本質的にアトミックであることを意味します。

  • アトミック オブジェクトの状態への変更は、すべてのスレッドに表示されることが保証されます。
  • >
  • アトミック オブジェクトへのアクセスにより、スレッド間の同期が確立され、非アトミック メモリが順序付けされる可能性があります

メモリ順序と std::atomic<>

std::atomic<> は、同期とメモリ順序を正確に制御します。さまざまなメモリ順序オプションをサポートし、以下を含みます:

  • std::memory_order_relaxed: 同期や順序の保証はありません。
  • std::memory_order_release: 同じアトミック変数を取得する他のスレッドから書き込みが見えるようにします。
  • std::memory_order_acquire: ことを保証します。ロードは、他のスレッドの同じアトミック変数に対するリリース操作の後に表示されます。
  • std::memory_order_seq_cst: すべてのアトミック操作間に順次一貫性 (完全なグローバル順序付け) を提供します。

例: 算術演算

個別= や などの算術演算子はアトミックな操作であり、それらを個別のロード、追加、ストアの操作に分解することはアトミックではない可能性があります。例:

a = a + 12;

この操作には次の手順が含まれます:

  1. a の値をロードします。
  2. それに 12 を加えます。
  3. 結果を a に戻します。

ステップ 2 と 3 は次のとおりです。アトミックではないため、追加とストアの間で別のスレッドが a を変更する可能性がある競合状態が発生する可能性があります。

基本的な算術演算の代替

一般的な使用例の場合算術演算を伴う場合は、std::atomic<> で定義されている同等のオーバーロード演算子を使用することをお勧めします。これらの演算子は操作全体をアトミックに実行し、逐次一貫性を確保します。

アトミック性とメモリ モデルに関する追加リソース

  • C アトミックとメモリの順序
  • 比較: C 11 のアトミックを使用したロックレス プログラミングとミューテックスおよびRW-locks
  • C 11 では、標準化されたメモリ モデルが導入されました。それはどういう意味ですか?そして、それは C プログラミングにどのような影響を与えるのでしょうか?
  • C 11 の同時実行性

以上がstd::atomic<> のアトミック オブジェクトとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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