只要线程的任何句柄都打开,线程ID是否保持唯一/有效?

时间:2013-02-13 21:55:54

标签: windows multithreading winapi visual-c++ windows-kernel

如果我有一个Win32线程,我通过句柄引用它,也可以获取它的线程ID。

The handle remains valid可用,直到我关闭句柄,即使线程已被终止。 (否则,无法使用例如GetExitCodeThread

然而,似乎文档未能一致地提及线程终止后线程ID的“发生”,但只要有人仍然拥有终止线程的线程句柄。

Thread Handles and Identifiers表示

  

从创建线程到线程终止之前,标识符有效。

当我们查看GetThreadId API时,如果ID在线程终止之前只有效,我们可能会想知道对于终止线程应该返回什么。 (并且还有一个用户评论这个网站:“不正确。只要有一个打开的句柄线程,它的线程ID仍然有效且唯一。”这确实回答了这个问题,是的,但没有更多上下文我很谨慎。)

另外,我在SO:

的答案中找到了this snippet
  

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

如果这是正确的并且线程ID确实是内核对象的ID,那么只要任何句柄都打开(因为内核对象需要保留在那里以供查询),它似乎必须保持有效)。

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

1 个答案:

答案 0 :(得分:6)

请注意:

所以标识符只能在最后一个线程句柄关闭后重用(也就是说,你的假设是正确的)。