线程ID是针对进程还是计算机唯一的?

17

如果我有一个线程ID,那么我可以确信在进程内或整个操作系统中(所有登录的用户)这个线程ID将是唯一的(只要线程正在运行)吗?


一旦你知道一个线程在其生命周期内可以在不同的核心/处理器上运行,并且该ID将在此期间保持不变,你就可以自己推断出答案;-) - Joachim Sauer
2个回答

14

是的,在Windows上,线程ID和进程ID是分配自同一池的,因此它们将是唯一的。然而,一旦线程或进程结束,该ID可能会被另一个线程或进程重新使用。


3
是的,谢谢。我知道PID是唯一的。我不确定线程ID。 - c00000fd
你能否详细解释一下线程 ID 或进程 ID 何时会被回收利用? - Christopher Oezbek
一旦内核对象被关闭,其ID就可以被重新使用。因此,以下操作是完全可能的:hThread1 = CreateThread(...&tid1); CloseHandle(hThread1); hThread2 = CreateThread(...&tid2); // tid1 == tid2, even hThread1 == hThread2 尽管它们现在引用不同的内核对象。 - parrowdice
只要仍有一个打开的句柄引用进程或线程,Windows上的PID或TID也将保持有效。这在“内核对象关闭后”有点暗示,因为打开的句柄也会使内核对象保持活动状态,我只是想澄清一下。因此,在进程/线程结束并且最后一个引用它的句柄已关闭之后,才能重新使用PID或TID。 - Paul Groke

9

一个线程在Windows平台上是由内核对象表示的。因此,它的ID将在所有进程和所有登录会话中是唯一的。然而,在线程内核对象关闭后,线程ID可能会被重新分配。

GetCurrentThreadId函数在运行时也明确说明了线程的唯一标识符。


@user843732:如果以正确的方式完成,是可以的。我使用这种技术来检查进程的父PID是否表示其父进程,而不是一个已经回收了其父进程PID的进程。 - parrowdice
@parrowdice:各位,还有一个后续问题。GetThreadTimes() API返回的FILETIME时间没有任何与计时器相关的“抖动”,对吧?文档声称线程创建的值以“100纳秒时间单位”表示,这非常精确!这不会导致内部计时器开始将其四舍五入为对该API的不同调用,对吧? - c00000fd
一个 FILETIME 结构始终是100纳秒的滴答声。这并不意味着底层API实际上会返回相差一个100纳秒滴答声的内容。此外,如果某些事情发生在少于100纳秒的时间内,值可能是相同的。所有这些都说了,你为什么关心这个回收?知道这一点可能有助于更好地回答问题。(目前的后续问题令人担忧。我脑海中正在响起各种警报,告诉我我们正在变得“太聪明”了。:-] ) - chwarr
谢谢提供链接!MSDN在这里https://msdn.microsoft.com/en-us/library/windows/desktop/ms681917%28v=vs.85%29.aspx和https://msdn.microsoft.com/en-us/library/windows/desktop/ms686746%28v=vs.85%29.aspx有很多文档,但显然他们选择将这个重要的信息隐藏在单个函数的文档中。 :) - Devolus
@paul groke:Raymond Chen在他的博客文章中提到-分配内核句柄的相同代码也会分配线程和进程句柄。当然,这是一个实现细节,并不能保证它将来不会改变... - parrowdice
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接