2011-08-04 9 views
12

スレッドプールスレッドが完了すると、名前やスレッドローカルデータのようなものがリセットされますか? 次回にスレッドがプールから出るとき、それはまったく新しいものですか?.NET ThreadPoolスレッドはプールに戻ったときにリセットされますか?

ThreadPoolスレッドのこの側面に関する「公式」ドキュメントはありますか?

+1

[ThreadStatic属性を持つ並列拡張機能を使用する]の可能な複製。それはメモリをリークすることができますか?](http://stackoverflow.com/questions/3029449/using-parallel-extensions-with-threadstatic-attribute-could-it-leak-memory) –

答えて

8

スレッドのローカルストレージが解放されてもクリアされません。これは、重要な点です。

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

スレッドプールがスレッドを再利用する場合、それは スレッドローカルストレージや ThreadStaticAttribute属性でマークされているフィールド内のデータを消去しません。したがって、1つの方法で スレッドローカルストレージに配置されたデータは、同じスレッドプールスレッドによって実行される他の方法 に公開される可能性があります。 がThreadStaticAttribute 属性でマークされたフィールドにアクセスする方法では、スレッドスレッド がスレッドスレッドを実行することによって異なるデータに遭遇する可能性があります。

これはについて非常に慎重になるものです...

+0

msdnへのリンクありがとうございます。もちろん、2.0のバージョンを見て、情報ブロックが欠落していました。 –

3

答えはいいえ、リセットされません。ただし、次の作業項目が新しいスレッドで実行されるか再利用されたスレッドで実行されるかは、スレッドプールに依存するため、この事実に頼るべきではありません。だから、ローカルストレージを再度スレッドすることがあります。スレッドプールでスレッドローカルストレージを使用することはお勧めできません。スレッドプールの実装は内部的な詳細であり、変更する必要があります。

現実世界のメタファーは、あなたが毎日働くためのバスになります。何らかの理由で、盗まれないことを知っているので、あなたのバッグをバスに残したいとします。これは悪い考えです。次回はバスに乗るときにバッグを見つけることができないからです。それは単に異なるバスにすることができるからです。バスデポは、ライン間でバスを回転させるか、古いバスを廃棄することができる。スレッドプールは、スレッドを再利用したり、スレッドをリタイアさせたりすることがあります。

関連する問題