C# ではいつ volatile キーワードを使用すればよいですか? 質問する

C# ではいつ volatile キーワードを使用すればよいですか? 質問する

誰か良い説明をしてくれませんか?volatileC# のキーワードは何ですか? どの問題が解決され、どの問題が解決されないのですか? どのような場合にロックの使用を回避できますか?

ベストアンサー1

この質問に答えるのにこれ以上適任者はいないと思うエリック・リパート(強調は原文のまま):

C# では、「揮発性」は「コンパイラとジッターがこの変数に対してコードの並べ替えやレジスタ キャッシュの最適化を実行しないようにする」という意味だけではありません。「他のプロセッサを停止してメイン メモリをキャッシュと同期させる必要がある場合でも、最新の値を読み取るために必要なことをプロセッサに指示する」という意味もあります。

実は、最後の部分は嘘です。揮発性の読み取りと書き込みの本当の意味は、ここで説明したものよりかなり複雑です。実際、すべてのプロセッサが実行中の処理を停止し、メイン メモリとの間でキャッシュを更新することを保証するものではありません。むしろ、読み取りと書き込みの前後のメモリ アクセスが相互に順序付けられていることを観察できるかどうかについて、より弱い保証を提供します。新しいスレッドの作成、ロックの入力、または Interlocked ファミリのメソッドのいずれかの使用などの特定の操作では、順序付けの観察に関するより強力な保証が導入されます。詳細については、C# 4.0 仕様のセクション 3.10 および 10.5.3 をお読みください。

率直に言って、volatile フィールドを作成することはお勧めしません。 volatile フィールドは、まったくおかしなことをしている兆候です。つまり、ロックを設定せずに 2 つの異なるスレッドで同じ値を読み書きしようとしているのです。 ロックは、ロック内で読み取られたり変更されたりしたメモリが一貫していることを保証し、ロックは、一度に 1 つのスレッドだけが特定のメモリ チャンクにアクセスすることを保証します。 ロックが遅すぎる状況は非常に少なく、正確なメモリ モデルを理解していないためにコードを間違える可能性は非常に高くなります。 インターロックされた操作のごくわずかな使用を除いて、私はロックの少ないコードを書こうとはしません。 「volatile」の使用は、本物の専門家に任せます。

詳細については以下を参照してください。

おすすめ記事