メモリ順序付けのコンテキストにおけるアトミック読み取り-変更-書き込み (RMW) の動作std::memory_order_acq_rel を使用した x.exchange(...) などの操作では、「これは操作ですか」という疑問が生じます。取得-解放セマンティクスを持つ単一のエンティティとして扱われるか、それとも取得ロードとそれに続くリリース ストアを含む一連の操作として扱われますか?
標準的な観点: 単一の操作
によるとC 標準では、RMW 操作は単一の操作とみなされます。この意味は、単数形を使用するその名前と、規格の関連する文言から生じます。したがって、このコンテキストでは、x.exchange(...) 操作は単一のエンティティとして見なされます。
順序付けの影響: 潜在的な並べ替え
標準の観点から見ると、提供されたコードは 0、1 を出力する可能性があります。この可能性が生じるのは、標準が演算の並べ替えに関して定義されているのではなく、 release 操作とacquire 操作の間の同期関係。
具体的には、y.load(acquire) 操作には、一致する release-or-stronger ストアがありません。したがって、他の操作とは同期せず、実質的に緩和されたロード (y.load(relaxed)) として扱われます。
さらに、x.exchange(1, acq_rel) 操作の "acquire" コンポーネントは、同期するストアがないため、取得セマンティクスが効果的に緩和されます。これにより、事実上、x.store(1, release) 操作に変換されます。
それぞれのスレッドで x のストアの前とロード後に操作がないため、これらの操作間の潜在的な同期が冗長になります。したがって、両方のロードは 0 または 1 を返すことができ、出力 0、1 が可能になります。
結論
C 標準の観点から見ると、アトミック読み取りは変更書き込み操作は単一の操作とみなされます。この理解は、提供された例では、ロードとストア間の同期が欠如しているため、コードが 0、1 を出力する可能性があることを意味します。
以上がアトミックな読み取り、変更、書き込みは単一の操作ですか、それとも一連の取得、解放操作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。