0

当社の製品は、ソケット ハンドル、メモリ、スレッドなど、多くの Windows リソースを消費します。通常、アクティブなスレッドは 700 ~ 900 ありますが、場合によっては、製品が新しいスレッドを迅速に作成して何らかの作業を行い、それを閉じることができます。弊社製品のクラッシュ メモリ ダンプを見つけました。~* windbg コマンドを使用すると、817 個のアクティブなスレッドを確認できますが、!handle コマンドを実行すると、次要約が出力されます。

タイプ数
なし 15
イベント 2603
セクション13
ファイル705
ディレクトリ 4
ミュータント 32
ウィンドウステーション 2
セマフォ 789
キー 208
工程1
スレッド 5766
デスクトップ 1
IoCompletion 308
タイマー 276
KeyedEvent 1
TpWorkerFactory 48

したがって、実際にはプロセスは 5766 スレッドを保持します。それで、私の質問は、Windowsが実際にプロセスのハンドルを解放するのはいつですか? 何らかの遅延やキャッシングは可能ですか?誰かがこの動作を説明できますか? ハンドル リークがあるとは思いませんが、システムのレガシー部分で、小さなタスクのスレッドをすばやく作成して閉じるという奇妙な動作があります。また、1000 を超えるスレッドを同時に実行する可能性は低いことを指摘したいと思います。これについてはかなり確信があります。ありがとう。

4

1 に答える 1

2

あなたが言うときSo, actually process holds 5766 threads.、あなたが本当に意味しているのは、プロセスが 5766 のスレッド ハンドルを保持しているということです。

スレッドが実行されなくなったとしても、それがExitThread()/への呼び出しの結果であるかTerminateThread()、 から戻った結果であるかにかかわらず、ThreadProcそのスレッドへのハンドルは有効なままです。これにより、作業を終了したスレッドのハンドルでGetExitCodeThread()を呼び出すなどのことが可能になります。

残念ながら、それは、単にリークさせるのではなく、呼び出すことを忘れないでください. CloseHandle()スレッドの作成に関する MSDN の例では、これをある程度カバーしています。

もう 1 つ注意しておきたいのは、実行中のスレッドが 1000 をはるかに超えていないところでは、32 ビット プロセスで使用できる仮想アドレス空間の量が使い果たされる可能性があるということです。これは、各スレッドがデフォルトでそのスタック用に 1MB のアドレス空間を予約するためです。

于 2013-04-19T15:11:19.187 に答える