NetServerEnum创build不会closures的工作线程

当试图解决我以前提出的SO问题时,我发现即使没有我的线程,也会出现问题。

我现在拥有的是一个非常简单的单线程代码,它调用了NetServerEnum() 。 当返回时,它调用NetApiBufferFree()并从main返回,这应该结束进程。 在这一点上,我的线程真正结束,但进程不会退出,因为有4个线程打开(而不是我):

1 * ntdll.dll!TplsTimerSet+0x7c0 (堆栈位于ntdll.dll!WaitForMultipleObjects

(这个调用NetServerEnum()打开)

3 * ndll.dll!RtValidateHeap+0x170 (堆栈位于ntdll.dll!ZwWaitWorkViaWorkerFactory+0xa

(这些是我的代码返回时打开)

更新:如果我杀死运行ntdll.dll!TplsTimerSet + 0x7c0(使用进程资源pipe理器)的线程,返回main() ,程序正常退出。 我认为这可能是有用的知道。

更新2:(一些更多的技术信息)我正在使用: MS Visual Studio 2010年终极x64 (SP1Rel) Win7企业SP1代码是C(但编译为c + +开关是)子系统:WINDOWS编译器:cl.exe(使用IDE)所有其他参数是默认的。

我使用自修改的入口点( /ENTRY:"entry" ),它是唯一的function在我的程序中):

 int entry(void) { SERVER_INFO_101* si; DWORD a,b; NET_API_STATUS c; c = NetServerEnum ( NULL , 101 , (LPBYTE*) &si , MAX_PREFERRED_LENGTH , &b , &a , SV_TYPE_WORKSTATION, NULL , 0 ); c = NetApiBufferFree (si); Sleep(1000); return 0; } 

在之前提到的所有testing中,在大约100个单元的Windowsnetworking内执行。

更新3:在(非虚拟) WinXP 32位上testing时不会发生此问题。 (相同的二进制,虽然为Win7的X64两个二进制testing – WOW的32位,本机X64)

Solutions Collecting From Web of "NetServerEnum创build不会closures的工作线程"

当您使用自定义入口点时,您将绕过运行时库,这意味着您有责任退出该进程。 如果没有更多线程在运行,进程将会隐式退出,但正如您发现的那样,操作系统可能会以您的名义为您创建无法控制的线程。

在你的情况下,你所要做的就是在entry()函数的末尾显式调用ExitProcess

 int entry(void) { SERVER_INFO_101* si; DWORD a,b; NET_API_STATUS c; c = NetserverEnum ( NULL , 101 , (LPBYTE*) &si , MAX_PREFERRED_LENGTH , &b , &a , SV_TYPE_WORKSTATION, NULL , 0 ); c = NetApiBufferFree (si); Sleep(1000); ExitProcess(0); } 

在没有调用ExitProcess的情况下,并且使用自定义入口点时,您看到的行为与预期的一样。