雖然試圖解決以前問我的SO問題,但我發現即使沒有我的線程,也會發生問題。NetServerEnum創建工作線程誰不會關閉
我現在擁有的是一個非常簡單的單線程代碼,即調用 - 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的外部線程(使用進程管理器),在返回main()
之前,程序正常退出。 我認爲這可能是有用的知道。
UPDATE2:(更多技術信息) 我使用: MS Visual Studio 2010的旗艦版64位上Win7企業(SP1Rel)SP1 代碼爲C(但編譯爲C++開關打開) 子系統:WINDOWS 編譯器:cl.exe(使用IDE) 所有其他參數都是默認值。
我使用自修改的條目點(/ENTRY:"entry"
),它是唯一的功能在我的程序):
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;
}
所有在那裏的大約100 Windows域網絡內部預製之前測試中提到單位。
UPDATE 3: 當在(非虛擬)測試不會發生此問題WinXP的32位。 (相同的二進制文件,雖然對於Win7 x64兩個二進制文件進行了測試 - 在WOW上爲32位,本機爲x64)
你會不會發布你的測試程序的完整代碼?對於那些如何重現你所描述的內容,這可能很有趣。有關環境(OS),編譯器和SDK版本的詳細信息可能會有所幫助。最後一個不是最不重要的,因爲它是關於網絡的,後者的描述也是很好的。 – alk
按照慣例,無論線程是否仍在運行,從'main'返回應該退出程序。但是,這取決於語言,編譯器和運行時庫;你在用什麼?在任何情況下,您都應該能夠通過顯式調用ExitProcess而不是從main返回來解決問題。 –
@alk請告訴我如果還有東西丟失 –