7

ThreadLocal<T>implementsに気付きましたIDisposable。これは、スレッド ローカル変数を使い終わったら破棄する必要があることを意味しています。具体的な懸念事項とは何か、何を注意し、何を避けるべきかを知りたいだけです。

スレッドが終了すると、スレッドのローカル ストレージは破棄されますか? ThreadLocal メンバーを破棄しない場合の最悪のケースは何ですか?

グローバル スレッド ローカル (矛盾した表現ですか? hehe) 変数 (またはThreadStatic変数) があり、この値を ThreadPool 内のスレッドに割り当てるとどうなりますか。スレッドローカル値の割り当て解除に注意する必要がありますか、それとも問題ではありませんか?

4

1 に答える 1

6

スレッド ローカルが存在する場合、スレッドによって自動的に破棄されるとは思いません。実装は開発者に任されています。MSDN から:

ThreadLocal への最後の参照を解放する前に、必ず Dispose を呼び出してください。そうしないと、使用しているリソースは、ガベージ コレクターが ThreadLocal オブジェクトの Finalize メソッドを呼び出すまで解放されません。

ただし、スレッド ローカル型が、使い捨てを保証するリソースを消費しないもの (たとえば、int やその他のプリミティブ型) である場合は、ガベージ コレクターが最終的に処理するため、破棄しなくても問題ありません。

一般に、オブジェクト参照の同じインスタンスを複数のオブジェクトが参照することは賢明ではありませんThreadLocal。実際、それは、スレッド ローカル ストレージが一般的に達成しようとしていることの粒度に反します。分離されたスレッド ローカルは、他のスレッドが (原則として) それらにアクセスできないという意味で、「スレッド セーフ」であると見なすことができます。スレッド セーフは微妙な概念であり、共有メモリに関する特定の制約と期待を確立する必要があることに注意してください。この文脈では、この用語を大まかな意味で使用しています。

于 2011-04-22T21:47:02.870 に答える