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

Mar*_* Ba 2 windows winapi multithreading visual-c++ windows-kernel

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

我关闭手柄之前,手柄仍然有效且可用,即使线程已经终止.(否则,无法使用例如GetExitCodeThread

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

线程句柄和标识符表明了这一点

标识符从创建线程到线程终止之间有效.

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

另外,我在SO上的答案中找到了这个片段:

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

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

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

Rom*_* R. 6

注意:

因此,只有在最后一个线程句柄关闭后才能重用标识符(也就是说,您的假设是正确的).