ホームページ >バックエンド開発 >C++ >C# スレッドは他のスレッドからの更新を無視してブール値をキャッシュできますか?

C# スレッドは他のスレッドからの更新を無視してブール値をキャッシュできますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-03 02:52:38729ブラウズ

Can a C# Thread Cache a Boolean Value, Ignoring Updates from Other Threads?

C# スレッドは値をキャッシュし、他のスレッドの変更を無視できますか?

提起された質問は、別のスレッドで変更された 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。