当所有线程内核对象句柄都关闭时,线程是否仍在运行

时间:2013-04-09 07:29:58

标签: multithreading winapi object

我很好奇当所有线程内核对象句柄都关闭时,该线程是否仍在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 个答案:

答案 0 :(得分:2)

是的,线程将一直运行直到它退出(通过从其初始线程程序返回),它被强制终止(通过TerminateThread_endthread(ex)),或者其父进程退出。是否存在线程句柄是无关紧要的。

如果您考虑它,它可能永远不会以任何其他方式工作 - 因为您可以等待线程句柄以确定它是否已退出,根据定义,线程生存期与句柄的生命周期无关。

答案 1 :(得分:2)

您引用的文字:

  

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

不适用于线程执行。线程执行直到完成。然后他们就不再执行了。线程句柄仅为您提供查询退出代码,等待发出信号,强制终止等的机制。

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