只要线程的任何句柄都处于打开状态,线程标识是否保持唯一/有效?
问题描述:
如果我有一个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文档或权威书籍明确指出其中之一?
答
需要注意的是:
- "Until a thread terminates, its thread identifier uniquely identifies it on the system."
- 线程,这ThreadProc的已经退出,但其手柄仍然是有效的且尚未闭合,仍然有其原有合法的标识符,直到最后一个句柄被关闭
- 您仍然可以执行反向查找“按线程标识符处理” - "If you have a thread identifier, you can get the thread handle by calling the OpenThread function."
因此,一个标识符只能在最后一个线程手后重新使用le是封闭的(也就是说,你的假设是正确的)。
好吧。嗯。 (1)真的说相反(“直到...终止”),不是吗? /(2)是的,我正在寻找一个来源。你是否有一个? /(3)是的,所有API暗示某种程度上答案似乎是肯定的。 – 2013-02-14 09:09:22
这不是相反的,而是不准确的。假如反向句柄查找在完成的ThreadProc上仍然有效,线程标识符生存期与krrnel对象本身的相同。 – 2013-02-14 09:38:22
你能提供一个引用来支持你的第二点:线程标识符保持不变,直到该线程的最后一个句柄被关闭? – 2017-02-07 18:45:52