ホームページ > バックエンド開発 > C++ > C のアトミックな読み取り、変更、書き込み操作は、取得、解放セマンティクスを備えた単一操作ですか、それともロードとストアのシーケンスですか?

C のアトミックな読み取り、変更、書き込み操作は、取得、解放セマンティクスを備えた単一操作ですか、それともロードとストアのシーケンスですか?

Barbara Streisand
リリース: 2024-12-07 19:22:13
オリジナル
314 人が閲覧しました

Are C   Atomic Read-Modify-Write Operations Single Operations with Acquire-Release Semantics, or a Sequence of Loads and Stores?

アトミックな読み取り-変更-書き込み操作によるメモリ順序付け

C では、 x などのアトミックな読み取り-変更-書き込み (RMW) 操作.exchange() は、他のロードおよびストアに関して特定の順序保証を強制します。これらの操作が考慮されるかどうかという疑問が生じます:

  1. 取得-解放セマンティクスを持つ単一操作
  2. 追加の保証を伴う解放ストアが続く取得ロード

標準パースペクティブ

C による標準では、RMW 操作は単一の操作として扱われます。これは、その単数形の名前と関連する文言によって暗示されています。

ARM64 実装

ARM64 では、RMW 操作はロード、アトミック交換、ストア命令のシーケンスとして実装されます。 。理論的には、この実装によりアトミック交換の前にストア命令が見えるようになりますが、これは標準のメモリ順序保証には影響しません。

メモリ同期

C でのメモリ同期これは主に、解放操作と取得操作の間の同期関係に基づいています。提供されたコード例:

  • x.exchange(1, std::memory_order_acq_rel): x.
  • への後続のストアがないため、synchronizes-with 関係の取得は重要ではありません。
  • x.load(std::memory_order_acquire): x の負荷は同期しません。

同期分析

他に同期する操作がないため、次のシーケンスが発生します:

  1. y に保存
  2. y にロード(relaxed)
  3. Load on x (relaxed)

Possible Output

したがって、コードは実際に 0、1 を出力できます。標準の観点では、RMW 操作は追加の保証のない単一の操作であることが暗示されており、これが可能になります。出力。

以上がC のアトミックな読み取り、変更、書き込み操作は、取得、解放セマンティクスを備えた単一操作ですか、それともロードとストアのシーケンスですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート