ホームページ >バックエンド開発 >C++ >C ではアトミックな読み取り、変更、書き込みは 1 つの操作ですか、それとも 2 つの操作ですか?

C ではアトミックな読み取り、変更、書き込みは 1 つの操作ですか、それとも 2 つの操作ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-05 02:13:09490ブラウズ

Is Atomic Read-Modify-Write a Single Operation or Two in C  ?

アトミック読み取り-変更-書き込み: 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
  • Line B には一致するリリースやより強力なストアがないため、事実上 y.store(1, std::memory_order_relaxed).
  • 行 A には一致する負荷のみがあり、その「取得」部分が冗長になっています。これは、x.store(1, std::memory_order_release) として表示できます。

結果として、コードは次のように削減されます。

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 サイトの他の関連記事を参照してください。

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