[解決済み】C#でvolatileキーワードはいつ使うべきですか?
質問
C#のvolatileキーワードについて、どなたか良い解説をお願いします。どの問題を解決して、どの問題を解決しないのでしょうか?どのような場合にロックの使用を節約できるのでしょうか?
どのように解決するのですか?
この質問に答えるのに、これ以上の適任者はいないと思います。 エリック・リッパート (原文では強調)。
C#では、quot;volatile"は、コンパイラとquot;volatile"を確認するだけではありません。 ジッターは、コードの並べ替えやレジスタのキャッシュを一切行いません。 この変数に対する最適化" 。また、「プロセッサーに指示する」という意味もあります。 を読んでいることを確認するために必要なことは何でもしてください。 たとえそれが、他のプロセッサを停止させ、最新の値を取得させることであっても。 メインメモリとキャッシュを同期させます。
実は、最後の部分は嘘なんです。揮発性読み出しの真のセマンティクスは と書き込みは、ここで説明したよりもかなり複雑です。 事実 すべてのプロセッサがその動作を停止することを保証するものではありません。 している と、メインメモリとの間でキャッシュを更新します。むしろ 提供する 読み出しと読み出しの前後のメモリアクセスがどのように行われるかについて、弱い保証があります。 書き込みの順序を観察することができます。 . 新しいスレッドを作成したり、ロックをかけたり、あるいは インターロック・メソッド・ファミリーの1つを使用することで、より強力な は、順序の観察について保証しています。より詳細が知りたい場合は C# 4.0仕様の3.10節と10.5.3節をお読みください。
率直な感想です。 揮発性フィールドを作成することはお勧めしません。 . 揮発性 フィールドは、あなたが何かとんでもないことをしようとしている証拠です。 2つのスレッドで同じ値の読み書きを行おうとしています。 ロックをかけずに ロックはメモリの読み出しや読み出しを保証するものです。 ロックされた内部で変更された内容が一貫していることが観察され、ロックは 一度に1つのスレッドのみがメモリの特定のチャンクにアクセスすること、など。 になります。ロックが遅すぎる状況というのは、非常に少ない。 また、コードを間違う確率も低くなります。 メモリモデルを正確に理解していないため、非常に大きな負担となります。I を除いては、低ロックのコードを書こうとはしません。 インターロック操作の使用法。volatile"の使い方は、この辺のことはよくわからない。 本当の専門家
さらに詳しい情報はこちらをご覧ください。
関連
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] enumを列挙するには
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] volatileキーワードは何に役立つのでしょうか?
-
[解決済み】大文字・小文字を区別しない「Contains(string)
-
[解決済み】C#のyieldキーワードは何に使われるのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み] 2つのリストを結合する
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。