6

私は Parallel Extensions をかなり頻繁に使用していますが、ワーカー スレッドによるオブジェクトの再利用を可能にするために、スレッド ローカル ストレージを使用することが適切なケースに遭遇しました。そのため、スレッドごとに一意の値を持つ静的フィールド/変数をマークする ThreadStatic 属性を見ていました。

PE によるスレッドの再利用を保証せずに、ThreadStatic 属性を指定して PE を使用するのは賢明ではないように思えます。つまり、スレッドがある程度作成および破棄された場合、変数 (およびそれらが指すオブジェクト) は不確定な時間スレッドローカルストレージに残り、メモリリークが発生しますか? それとも、スレッドストレージはスレッドに関連付けられており、スレッドが破棄されるときに破棄されますか? しかし、プール内に、スレッドが使用されるコードのさまざまな部分からスレッド ローカル ストレージを蓄積する、長く存続しているスレッドが潜在的に存在する可能性があります。

PE でスレッド ローカル ストレージを取得するためのより良い方法はありますか?

ありがとうございました。

4

2 に答える 2

5

このMSDN の記事で説明されているスレッド ローカル ストレージの通常のパターンを使用することを強くお勧めします。

[ThreadStatic] を使用する場合、重要なのは、スレッドプール スレッドが終了時に TLS 変数をクリーンアップするかどうかです。MSDN ドキュメントには、そうではないという提案はありません。実装は難しくありません。TlsFree() API 関数を呼び出すだけです。私は小さなテストアプリを書きましたが、リークの証拠はありません。

于 2010-06-12T18:02:23.813 に答える
4

編集:ハンスの答えを考えると、TLSは実際にはとにかくクリーンアップされるように思えます...これは、答えのこのビットを残すだけです:

スレッド内で値を再利用するより良い方法はありませんか? 同じスレッドを使用する 2 つのタスクがある場合 (一方が完了し、次にもう一方が実行される)、それらは本当に同じ値を必要とするでしょうか? タスクを通じてより制御された方法でデータを伝播することを避ける方法として、実際にこれを使用しているだけですか?

于 2010-06-12T17:19:16.887 に答える