2013-04-09 90 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

文本你报价:

的对象保留在内存中,只要至少一个对象的句柄存在。

不适用于线程执行。线程执行直到完成。然后他们停止执行。线程句柄只是提供一种机制来查询退出代码,等待直到发出信号,强制终止等。

因此,关闭线程的最终句柄不会终止线程。