ThreadPool を介して循環された場合、ThreadStatic 変数の値はまだ存在しますか?

StackOverflow https://stackoverflow.com/questions/854976

質問

ThreadStatic 変数を使用して一部のデータを保存していますが、スレッドに保存したデータが、処理を終えて ThreadPool に解放した後もそこに残るのではないかと心配しています。スレッドを終了する前に ThreadStatic 変数をクリアすることを心配する必要がありますか?それとも、次の QueueUserWorkItem に「渡す」前に、ThreadPool がこれを実行しますか?アプリ内の他のスレッドが ThreadStatic 変数に関して白紙の状態で作業できるようにする必要があるため、これは私にとって特に重要です。ありがとう!

役に立ちましたか?

解決

スレッド プールは (仕様により) 呼び出し間でスレッドを維持します。これは、ThreadStatic 変数が QueueUserWorkItem の呼び出し間で保持されることを意味します。

この動作も当てにすべきではありません。ThreadPool は (最終的にはその裁量で) スレッドを解放して終了させ、必要に応じて新しいスレッドを構築します。

ただし、これで問題が発生する場合は、あなたの設計に疑問を抱きます。QueueUserWorkItem で使用する特定の決定論的な ThreadStatic データが必要な場合は、スレッド処理を自分で行うためのスレッド ルーチンが適切な候補となる可能性があります。ThreadStatic と ThreadPool は、常に優れた組み合わせであるとは限りません。(ThreadPool がスレッドを管理するため) ThreadStatic 変数を実際に活用してメリットを得るには、必ずしも十分な制御ができるわけではありません。2 つの作業項目が同じスレッド上にあるのか、異なるスレッド上にあるのか、また threadstatic 変数を (再) 初期化する必要があるのか​​どうかなどはわかりません。

他のヒント

それらはメソッド間に残ると思います。もちろん、疑わしい場合は、ワーカー メソッドの開始時にスレッド静的変数をリセットしてください。または使用します try/finally 値をクリアするには それぞれの作業単位。

(編集)

それらが実際に残っていることを証明するのは非常に簡単です。上記はすぐに 0 より大きい数値の出力を開始します (毎回 0 は、異なるワーカーが分離されている場合に予想される値です)。

[STAThread]
static void Main()
{
    for (int i = 0; i < 50; i++)
    {
        ThreadPool.QueueUserWorkItem(DoStuff);
    }
    Console.ReadLine();
}
static void DoStuff(object state)
{
    Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": " + value++);
    Thread.Sleep(20);
}
[ThreadStatic]
static int value;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top