C# スレッドは実際に値をキャッシュし、他のスレッドからの変更を無視できますか?
マルチスレッド プログラミングでは、複数のスレッド間でデータの一貫性を維持することが重要です。スレッド。よくある質問の 1 つは、C# スレッドが値をキャッシュし、他のスレッドによる変更を無視できるかどうかです。
メモリ モデルについて
.NET Framework はメモリ モデルを提供します。これは、スレッドが共有メモリとどのように対話するかを定義します。このモデルによれば、変数はスレッドセーフか非スレッドセーフのいずれかになります。スレッドセーフな変数は、データを破損することなく複数のスレッドから同時にアクセスまたは変更できます。一方、非スレッドセーフ変数は、複数のスレッドから同時に変更された場合、競合状態やデータの不整合を引き起こす可能性があります。
主張と反訴
一部記事では、C# スレッドは値をキャッシュし、スレッド セーフでない変数であっても他のスレッドで行われた変更を無視できると主張しています。彼らは、この動作は、スレッドが変数の独自のキャッシュされたコピーを持つことを可能にする揮発性メモリ モデルによるものであると主張しています。
しかし、批評家は、.NET ランタイムがメモリ モデルの複雑さを抽象化し、メモリ モデルの複雑さを確保していると主張しています。あるスレッドで行われた変更は他のスレッドにも表示されます。
反例と解決策
主張を検証するために、問題のコードの改訂版が提示されます。
private static volatile bool stopping = false;
volatile キーワードにより、停止変数への変更がすべてのユーザーに即座に表示されるようになります。スレッド。この変更により、キャッシュの可能性がすべて削除され、プログラムが意図したとおりに動作することが保証されます。
Output: Main exit DoWork exit 654
結論
一方、引用されている記事では、キャッシュの動作の可能性が示されている可能性があります。アンマネージ コード内の揮発性変数に対して、.NET ランタイムは共有変数へのスレッドセーフなアクセスを強制します。その結果、C# スレッドが値をキャッシュし、他のスレッドの変更を無視できるという主張は、一般的なマネージ コード アプリケーションでは根拠がありません。
以上がC# スレッドは値をキャッシュし、他のスレッドからの更新を無視できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。