メモリ順序付けにおけるアトミック読み取り-変更-書き込み (RMW) 操作の処理
アトミック読み取りの性質に関する質問への回答-modify-write (RMW) 操作。C 標準では、取得と解放の両方を組み合わせたセマンティクスを持つ単一の操作として分類されます。 property.
順序付けの意味
この指定は、同じスレッド内で発生するメモリの読み取りまたは書き込みを RMW 操作の前後に並べ替えることができないことを意味します。ただし、RMW の内部読み取りコンポーネントと書き込みコンポーネントの間で順序を変更する可能性が排除されるわけではありません。
具体例
次のコード例を検討してください。
std::atomic<int> x, y; void thread_A() { x.exchange(1, std::memory_order_acq_rel); y.store(1, std::memory_order_relaxed); } void thread_B() { int yy = y.load(std::memory_order_acquire); int xx = x.load(std::memory_order_acquire); std::cout << xx << ", " << yy << std::endl; }
このシナリオでは、スレッド B は確かに 0、1 を出力できます。これは、ロードおよびストア操作が実行されたためです。スレッド A の RMW 操作は内部的に順序を変更できるため、スレッド B はロード (0) 後、ストア (1) 前の状態を監視できます。
ARM64 実装
RMW 操作の ARM64 実装は、ldaxr、stlxr、および str 命令で説明されているように、次のようになります。規格の期待。 str 命令は stlxr 命令の前に表示される可能性があり、スレッド B による 0、1 の観測につながる可能性があります。
メモリ順序の影響
memory_order_acq_rel を seq_cst に置き換えると、他の seq_cst 操作に関連する追加のセマンティクスを導入するだけなので、この動作には影響しません。これはコード例にはありません。
結論
C のアトミック RMW 操作は、取得-解放セマンティクスを持つ単一操作です。外部操作の前後の並べ替えは防止しますが、内部コンポーネント間で並べ替えが行われる可能性があるため、コード例のような、スレッド B が 0、1 を出力できるシナリオが可能になります。
以上がC のアトミックな読み取り、変更、書き込み操作の内部並べ替えはメモリの順序付けにどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。