当Windows发布线程?

时间:2013-04-19 11:14:24

标签: windows debugging resources windbg

我们的产品消耗了大量的Windows资源,如套接字句柄,内存,线程等。通常有700-900个活动线程,但在某些情况下,产品可以快速创建新线程并完成一些工作,然后关闭它。 我遇到了我们产品的崩溃内存转储。使用〜* windbg命令,我可以看到817个活动线程,但是当我运行!handle 命令时,它会打印出这些摘要:

Type            Count
None            15
Event           2603
Section         13
File            705
Directory       4
Mutant          32
WindowStation   2
Semaphore       789
Key             208
Process         1
Thread          5766
Desktop         1
IoCompletion    308
Timer           276
KeyedEvent      1
TpWorkerFactory 48

因此,实际进程拥有5766个线程。所以,我的问题,当Windows实际上释放进程的句柄?有可能出现某种延迟或兑现吗?有人可以解释这种行为吗? 我认为我们没有处理泄漏,但我们在系统的遗留部分中有奇怪的行为,可以快速创建和关闭小任务的线程。另外我想指出,我们不太可能同时运行超过1000个线程,我对此非常肯定。 感谢。

1 个答案:

答案 0 :(得分:2)

当你说So, actually process holds 5766 threads.时,你的意思是该过程包含5766个线程句柄

即使线程可能不再运行,无论是调用ExitThread() / TerminateThread()还是从ThreadProc返回的结果,该线程的任何句柄都将保留有效。这样就可以在已经完成工作的线程的句柄上调用GetExitCodeThread()

不幸的是,这意味着您必须remember to call CloseHandle()而不是让它泄漏。 Creating Threads上的MSDN示例在某种程度上涵盖了这一点。

我要注意的另一件事是,在不超过1000个运行线程的地方,你很可能exhaust the amount of virtual address space available到32位进程,因为默认情况下每个线程为其堆栈保留1MB的地址空间。