只要线程的任何句柄都处于打开状态,线程标识是否保持唯一/有效?

问题描述:

如果我有一个Win32线程,我通过一个句柄引用它,也可以获得它的线程ID。只要线程的任何句柄都处于打开状态,线程标识是否保持唯一/有效?

The handle remains valid并且可用,直到我关闭句柄,即使线程已被终止。 (否则,一个不能使用例如GetExitCodeThread

看来不过,文档并没有一致地提到线程终止后线程ID“发生”的情况,但只要任何人仍然拥有线程句柄终止线程。

Thread Handles and Identifiers指出

标识符是由线程被创建,直到线程被终止时有效。

然后,当我们查看GetThreadId API时,我们可以想知道,如果ID只有在线程终止时才会有效,那么终止线程应该返回什么。 (也有一个用户在这个网站上发表评论:“是不正确的,只要线程有一个开放的句柄,它的线程ID仍然是有效的和唯一的。”这是在这里回答这个问题是的,但没有更多背景我警惕)

另外,我发现this snippet在这里回答关于SO:

的ID是在 系统中运行的线程的唯一数字idetifier。与任何内核对象句柄一样,线程句柄可以看作是指向内核对象的特殊类型的引用计数指针。

如果这是正确的,线程ID确实是内核对象的ID,那么似乎就有必要对这个ID仍然有效,只要任何手柄打开(因为内核对象需要留在那里被查询)。

是我的推理的声音?只要任何句柄打开,线程ID是否有效?是否有任何 MS文档或权威书籍明确指出其中之一?

需要注意的是:

因此,一个标识符只能在最后一个线程手后重新使用le是封闭的(也就是说,你的假设是正确的)。

+0

好吧。嗯。 (1)真的说相反(“直到...终止”),不是吗? /(2)是的,我正在寻找一个来源。你是否有一个? /(3)是的,所有API暗示某种程度上答案似乎是肯定的。 – 2013-02-14 09:09:22

+0

这不是相反的,而是不准确的。假如反向句柄查找在完成的ThreadProc上仍然有效,线程标识符生存期与krrnel对象本身的相同。 – 2013-02-14 09:38:22

+0

你能提供一个引用来支持你的第二点:线程标识符保持不变,直到该线程的最后一个句柄被关闭? – 2017-02-07 18:45:52