アトミック読み取り-変更-書き込み: 1 つの操作または 2 つの操作?
同期目的の場合、アトミック読み取り-変更-書き込み (RMW) x.exchange(..., std::memory_order_acq_rel) のような操作は、その扱いに関して疑問を引き起こします。これらは 1 つの操作と見なされますか? それとも 2 つの別個の操作と見なされますか?
標準の観点
C 標準では、RMW 操作を 単一のエンティティ とみなします。これは、その名前から明らかであり、さまざまな関連言語で暗黙的に示されています。
同期の影響
あなたの例では:
x.exchange(1, std::memory_order_acq_rel); // Line A y.store(1, std::memory_order_relaxed); // Line B
結果として、コードは次のように削減されます。
x.store(1, std::memory_order_release); y.store(1, std::memory_order_relaxed);
これらの間には操作がないためです。他のスレッドでストアと対応するロードを行うと、同期は事実上無効になります。これにより、0、1 を出力する可能性が考慮されます。
ARM64 の実装と影響
ARM64 の x.exchange() の実装には懸念が生じます。ただし、詳しく調べると、実装が単一の RMW 操作に関する標準の観点と一致していることは明らかです。順序付けシーケンスにより、RMW の最後の読み取り値が書き込み値と一貫していることが保証されます。
cppreference の引用が正しくありません
cppreference から引用されたテキストが不正確です。 C の RMW 操作は単一の操作として扱われ、その前後に他の操作を並べ替えることは禁止されています。
以上がC ではアトミックな読み取り、変更、書き込みは 1 つの操作ですか、それとも 2 つの操作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。