【问题标题】:when all thread kernel object handles is closed, does the thread still running当所有线程内核对象句柄都关闭时,线程是否仍在运行
【发布时间】:2013-04-09 07:29:58
【问题描述】:

我很好奇当所有线程内核对象句柄都关闭后,线程是否还在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;
}

输出是

看起来当所有句柄都关闭时,线程仍在运行。但是,msdn 说“只要至少有一个对象句柄存在,一个对象就会保留在内存中”。这很奇怪。

【问题讨论】:

    标签: multithreading winapi object


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你引用的文字:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-20
        • 2020-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-04
        • 2012-09-05
        相关资源
        最近更新 更多