2013-06-12 76 views
0

雖然試圖解決以前問我的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)

+0

你會不會發布你的測試程序的完整代碼?對於那些如何重現你所描述的內容,這可能很有趣。有關環境(OS),編譯器和SDK版本的詳細信息可能會有所幫助。最後一個不是最不重要的,因爲它是關於網絡的,後者的描述也是很好的。 – alk

+0

按照慣例,無論線程是否仍在運行,從'main'返回應該退出程序。但是,這取決於語言,編譯器和運行時庫;你在用什麼?在任何情況下,您都應該能夠通過顯式調用ExitProcess而不是從main返回來解決問題。 –

+0

@alk請告訴我如果還有東西丟失 –

回答

0

當您使用自定義入口點時,您繞過運行時庫,這意味着您負責退出該過程。如果沒有更多線程在運行,進程將隱式退出,但正如您發現的那樣,操作系統可能代表您創建了無法控制的線程。

在你的情況下,你需要做的就是在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和一個自定義的切入點,你所看到的行爲是按預期。

+0

感謝。這確實是發佈的問題的答案,但它並沒有真正解決我的問題(這篇文章是減少我的實際問題)。我的實際問題是我與其他一些我沒有影響的功能共享這個過程。當我的線程完成時,我希望它在釋放所有資源後返回,包括結束所有系統線程。 –

+0

系統線程屬於整個進程,而不屬於您的特定線程,因此終止它們將是一個非常糟糕的主意。這是父級流程工作要正確退出,難道你不能跟誰負責嗎?我能想到的唯一的其他選擇是讓你的線程啓動一個子進程並在那裏執行NetApi工作。 –

+0

好的,即使這些系統線程最初只是由我的線程中的函數創建的,一些有意義的。無論如何,我們可以在身體上進行交談,但由於管理層的決定,我們不能互相影響。 –