如果我有一个 Win32 线程,我通过句柄引用它,也可以获得它的线程 ID。
在我关闭句柄之前,句柄仍然有效且可用,即使线程已终止。(否则,无法使用例如GetExitCodeThread
然而,文档似乎没有一致地提及线程终止后线程 ID “发生”了什么,但只要任何人仍然持有终止线程的线程句柄。
线程句柄和标识符指出
从线程创建到线程终止,标识符都是有效的。
然后,当我们查看GetThreadId API 时,我们会想知道如果 ID 仅在线程终止之前有效,那么对于终止的线程应该返回什么。(并且该站点上还有一条用户评论:“不正确。只要线程有一个打开的句柄,它的线程 ID 仍然有效且唯一。”这确实回答了这个问题,但没有更多上下文我很警惕。)
另外,我在 SO 的答案中找到了这个片段:
ID 是系统中运行的线程的唯一数字标识符。与任何内核对象句柄一样,线程句柄可以看作是一种特殊类型的指向内核对象的引用计数指针。
如果这是正确的,并且线程 ID 确实是内核对象的 ID,那么只要打开任何句柄,这个 ID 就必须保持有效(因为内核对象需要保留在那里才能被查询)。
我的推理合理吗?只要打开任何句柄,线程 ID 是否有效?是否有任何MS 文档或权威书籍明确说明其中之一?