0

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

类型计数
无 15
事件 2603
第 13 条
文件 705
目录 4
突变体 32
窗口站 2
信号量 789
钥匙 208
过程 1
线程 5766
桌面 1
IO完成308
定时器 276
键控事件 1
TpWorkerFactory 48

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

4

1 回答 1

2

当您说So, actually process holds 5766 threads.时,您真正的意思是该进程拥有 5766 个线程句柄

即使线程可能不再运行,无论是调用ExitThread()/TerminateThread()或从 . 返回的结果ThreadProc,该线程的任何句柄都将保持有效。这使得在已完成其工作的线程的句柄上调用GetExitCodeThread()之类的事情成为可能。

不幸的是,这意味着您必须记住调用CloseHandle()而不是让它泄漏。创建线程的 MSDN 示例在某种程度上涵盖了这一点。

我要注意的另一件事是,在不超过 1000 个运行线程的地方,您可能会耗尽可用于 32 位进程的虚拟地址空间量,因为默认情况下每个线程为其堆栈保留 1MB 的地址空间。

于 2013-04-19T15:11:19.187 回答