2013-04-09 87 views
0

我很好奇當所有線程內核對象句柄關閉時,線程是否仍然在Win32中運行?當所有線程內核對象句柄關閉時,線程仍在運行

所以我寫了一個簡單的測試代碼像

#include <cstdio> 
#include <Windows.h> 
#include <process.h> 

unsigned int __stdcall thread1_main(void* p) 
{ 
    while(1) 
     printf("thread1 is running!\n"); 
    return 0; 
} 

int main() 
{ 
    HANDLE h = (HANDLE)_beginthreadex(NULL, 0, thread1_main, NULL, 0, NULL); 
    CloseHandle(h); 
    while(1) 
     printf("main thread is running!\n"); 
    return 0; 
} 

和輸出

enter image description here

它看起來像當所有關閉句柄,線程仍在運行。但是,msdn說「只要至少存在一個對象句柄,對象就會保留在內存中」。這很奇怪。

回答

2

是的,線程會一直運行直到退出(通過從其初始線程過程返回),它會被強制終止(通過TerminateThread_endthread(ex)),或者其父進程退出。線程的句柄是否存在是無關緊要的。

如果你考慮它,它將無法以其他方式工作 - 因爲你可以等待線程句柄來確定它是否退出,根據定義,線程生命週期與句柄的生命週期無關。

2

文本你報價:

的對象保留在內存中,只要至少一個對象的句柄存在。

不適用於線程執行。線程執行直到完成。然後他們停止執行。線程句柄只是提供一種機制來查詢退出代碼,等待直到發出信號,強制終止等。

因此,關閉線程的最終句柄不會終止線程。