2012-03-21 12 views
1

私は別々のスレッドでパイプラインを処理するアプリケーションで作業しています。私のテストでは、プロセスが「軽量」であるか、またはCLRによってこれがすぐに終了すると判断された場合、CLRはこのスレッドを迅速にリサイクルし、さまざまな作業単位を同じスレッドで同時に共有できます。CLR管理スレッド:軽量プロセスと重いプロセス

逆に、処理に時間がかかったり、負荷が増えたりすると、異なるスレッドが開きます。

私にとってはすべて難しいです。TLS Thread local storageプログラミング。

実際、私のアプリケーションパイプラインは処理に時間がかかり、CLRは常に相互に1つのマネージスレッドを割り当てているようです。 BTW場合によっては、2つのパイプラインが1つの管理スレッドを共有する場合、TLS変数を使用するため衝突します。

結局のところ本当の疑問は...私は、プロセスがある程度の時間を要する場合、それは常に自分のスレッドを使用するか、それとも狂っているのだろうという前提をすることはできますか?

私が管理しているスレッドを.net 3.5で読んでいるのは、一種のブラックボックスで動作するようなものです。だからおそらくこの質問は決して本当に返答することはできません。

EDIT:私は辞書の定義結果タスクマネージャでは識別できないコンピュータプロセスをもたらす行動、変更、または一連の機能にrefereingいプロセスで

+2

'プロセス'を定義します。あなたのプロセスの使用は、標準の定義と多少異なるようです。 –

+1

変数が実際にはスレッドごとではない場合は、スレッドローカルストレージを使用しないでください。アクティビティごとに必要な場合は、変数を特定のアクティビティに関連付けます。 – dlev

+1

この質問を解読するのは難しいです。実行中のスレッドがタイムリーに完了しないと、スレッドプールマネージャが追加のスレッドを開始しているのを見ているだけです。 –

答えて

1

は、私は、プロセスに時間がかかる場合は/それは 常にそれ自身のスレッドを使用するロード、または私は

Processは、常に独自のスレッドを使用していることをやってクレイジーだという仮定を行うことができます。他のプロセスのスレッドにアクセスすることはできません。私が知っているスレッドではありません。

+0

私は、2つのCLRプロセス/アクションが同じ管理スレッドを共有できるかどうかという疑問を認識しています。 – guillem

+0

@guillem:実際、私はそれが**不可能であると私は気づいていると答えている。 – Tigran

+0

実際に私が見たことは、アクションが長くかからない場合、同じmanagedThreadIdを他のユーザーと共有できるので、同じスレッドを共有できるからです。 – guillem

0

スレッドプールスレッドから実行されるコードは、スレッドローカルストレージ内に、finallyブロック経由で削除されないものを配置すべきではありません。コードが実行された後にコードによって使用されるスレッドローカルストレージが確実に消失するようにする必要がある場合は、明示的にストレージをクリーンアップするか、そのコードを独自のスレッドで実行する必要があります。

+0

私はそれを知らなかった...それはガベージコレクタの仕事ではありませんか?デバッガでこれを見ることはできますか? '[ThreadStatic]'デコレータを使うとどうなりますか? – guillem

+1

@guillem:ガベージコレクタの仕事は、他の方法ではアクセスできないメモリの再利用を可能にすることです。スレッドプールによって呼び出されたルーチンが[ThreadStatic]フィールドを設定し、それがまだ設定されている間に終了すると、そのフィールドはスレッドプール*によって実行され、同じスレッド*が与えられます。フィールドにアクセスできる一連のイベントが存在するため、ガベージコレクタはそのフィールドを保持する必要があります。ガベージコレクタの低評価されている特徴の1つは、何かが「有用か」であるかどうかという概念が最小限であることです。 – supercat

+0

@guillem: 'WeakReference'で保持されているアイテムと' Object.Finalize'をオーバーライドしているアイテムは特別なケースです。ガベージコレクタはターゲットに強い参照が存在しないときに 'WeakReference'を無効にすることができ、ファイナライズ・キューには参照が存在しますが、それ以外は存在しません。しかし、そのような場合を除いて、オブジェクトが参照される手段が存在するという事実は、ガベージコレクタがそれを収集するのを防ぐのに十分である。 – supercat

関連する問題