[解決済み] 連動と揮発性
質問
状態を表すために使用している変数があります。この変数は、複数のスレッドから読み書きすることができます。
私は
Interlocked.Exchange
と
Interlocked.CompareExchange
で変更することができます。しかし、私は複数のスレッドからそれを読んでいます。
私が知っているのは
volatile
を使用すると、変数がローカルにキャッシュされず、常にメモリから直接読み込まれるようにすることができます。
しかし、変数をvolatileに設定すると、volatileの使用とInterlockedメソッドへのrefを使用した受け渡しに関する警告が発生します。
各スレッドがキャッシュされたバージョンではなく、変数の最新の値を読んでいることを確認したいのですが、volatile を使用することができません。
には
Interlocked.Read
がありますが、これは64ビット型用で、コンパクトフレームワークでは使用できません。これのドキュメントによると、32 ビット型ではすでに 1 回の操作で実行されるため、必要ないとのことです。
インターネット上では、すべてのアクセスに Interlocked メソッドを使用する場合は volatile は必要ない、という記述があります。しかし、Interlockedメソッドを使用して32ビット変数を読み取ることはできないので、すべてのアクセスにInterlockedメソッドを使用できるわけではありません。
ロックを使用せずに、変数のスレッドセーフな読み取りと書き込みを実現する方法はありますか。
どのように解決するのですか?
を使っているときは、この警告を無視しても大丈夫です。
Interlocked.Xxx
関数を使用している場合は、この警告を無視しても問題ありません (
この質問
を参照)、それらは常に揮発性の操作を行うからです。そのため
volatile
変数は共有状態のために完全にOKです。もし、なんとしても警告をなくしたいのであれば、実際には
ができます。
でインターロックリードを行うことができます。
Interlocked.CompareExchange (ref counter, 0, 0)
.
編集してください。
実際には
volatile
が必要です。
だけです。
に直接書き込む場合 (つまり
Interlocked.Xxx
).
jerryjvl が言っているように
のように、連動した(またはvolatile)操作で更新された変数の読み込みは、最新の値を使用します。
関連
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] 揮発性 vs. 連動性 vs. ロック性
-
[解決済み] lockステートメントは、ボンネットの中で何をするのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。