我们的产品消耗了大量的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个线程,我对此非常肯定。 感谢。
答案 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的地址空间。