1. ホーム
  2. c#

[解決済み】C#でvolatileキーワードはいつ使うべきですか?

2022-05-02 18:56:22

質問

C#のvolatileキーワードについて、どなたか良い解説をお願いします。どの問題を解決して、どの問題を解決しないのでしょうか?どのような場合にロックの使用を節約できるのでしょうか?

どのように解決するのですか?

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

C#では、quot;volatile"は、コンパイラとquot;volatile"を確認するだけではありません。 ジッターは、コードの並べ替えやレジスタのキャッシュを一切行いません。 この変数に対する最適化" 。また、「プロセッサーに指示する」という意味もあります。 を読んでいることを確認するために必要なことは何でもしてください。 たとえそれが、他のプロセッサを停止させ、最新の値を取得させることであっても。 メインメモリとキャッシュを同期させます。

実は、最後の部分は嘘なんです。揮発性読み出しの真のセマンティクスは と書き込みは、ここで説明したよりもかなり複雑です。 事実 すべてのプロセッサがその動作を停止することを保証するものではありません。 している と、メインメモリとの間でキャッシュを更新します。むしろ 提供する 読み出しと読み出しの前後のメモリアクセスがどのように行われるかについて、弱い保証があります。 書き込みの順序を観察することができます。 . 新しいスレッドを作成したり、ロックをかけたり、あるいは インターロック・メソッド・ファミリーの1つを使用することで、より強力な は、順序の観察について保証しています。より詳細が知りたい場合は C# 4.0仕様の3.10節と10.5.3節をお読みください。

率直な感想です。 揮発性フィールドを作成することはお勧めしません。 . 揮発性 フィールドは、あなたが何かとんでもないことをしようとしている証拠です。 2つのスレッドで同じ値の読み書きを行おうとしています。 ロックをかけずに ロックはメモリの読み出しや読み出しを保証するものです。 ロックされた内部で変更された内容が一貫していることが観察され、ロックは 一度に1つのスレッドのみがメモリの特定のチャンクにアクセスすること、など。 になります。ロックが遅すぎる状況というのは、非常に少ない。 また、コードを間違う確率も低くなります。 メモリモデルを正確に理解していないため、非常に大きな負担となります。I を除いては、低ロックのコードを書こうとはしません。 インターロック操作の使用法。volatile"の使い方は、この辺のことはよくわからない。 本当の専門家

さらに詳しい情報はこちらをご覧ください。