提起された質問は、別のスレッドで変更された bool 値を読み取るときの C# スレッドの動作に関するものです。糸。一部の記事では、読み取りスレッドが古い値をキャッシュし、無限ループにつながる可能性があると示唆しています。
スレッド セーフのために変数をロックすることは良い習慣ですが、.NETランタイムは、揮発性メモリに関連する問題を抽象化するように設計されています。ただし、この分野の専門家によると、提供されている例で観察される動作は、仕様によって保証されていません。
サンプル コードは、次の間で共有されるブール値 (停止) を示しています。 2つのスレッド。 1 つのスレッドは 5 秒の遅延後に値を true に設定し、別のスレッドはループ内で継続的に値を読み取ります。理論的には、適切な同期 (ロックなど) がなければ、読み取りスレッドは初期の false 値をキャッシュし、更新された true 値を決して読み取ることができない可能性があります。
このシナリオでは、停止を次のように設定した後、再現可能な反例が示されています。 true の場合、DoWork スレッドは無期限に実行され続け、古い値がキャッシュされていることを示します。
// using System.Threading; private static bool stopping = false; // Make volatile to fix the issue static void DoWork() { int i = 0; while (!stopping) { i++; } Console.WriteLine("DoWork exit " + i); }解決策正しい動作を保証するには、共有変数を volatile としてマークすることが重要です。メモリバリアを保護し、キャッシュにつながる可能性のある最適化を防ぎます。あるいは、ロックを使用して変数へのアクセスを同期すると、問題も解決します。
以上がC# スレッドは他のスレッドからの更新を無視してブール値をキャッシュできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。