【问题标题】:Are thread IDs unique per process or per computer?每个进程或每台计算机的线程 ID 是唯一的吗?
【发布时间】:2012-11-27 17:20:45
【问题描述】:

比如说,如果我有一个线程 ID,我可以确保它在每个进程或整个操作系统(在所有登录用户中)都是唯一的(只要线程正在运行)?

【问题讨论】:

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

标签: c++ multithreading winapi thread-safety


【解决方案1】:

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

【讨论】:

  • 好的,谢谢。我知道 PID 是独一无二的。我不确定线程​​ ID。
  • 您能否扩展您的答案以解释线程 ID 或进程 ID 被回收的频率?
  • @ChristopherOezbek 一旦内核对象关闭,它的 ID 就可以重新使用。所以以下是完全可能的:hThread1 = CreateThread(...&tid1); CloseHandle(hThread1); hThread2 = CreateThread(...&tid2); // tid1 == tid2, even hThread1 == hThread2 虽然它们现在引用不同的内核对象。
  • 只要还有一个引用进程或线程的打开句柄,Windows 上的 PID 或 TID 也将保持有效。这是“一旦内核对象关闭”所暗示的,因为打开的句柄也使内核对象保持活动状态,我只是想澄清一下。因此 PID 或 TID 重用只能在进程/线程结束后发生并且引用它的最后一个句柄已关闭。
【解决方案2】:

线程由内核对象表示,例如在 Windows 平台上。因此,它的 id 在所有登录会话的所有进程中都是唯一的。但是线程ID可以在线程内核对象关闭后回收。

GetCurrentThreadId 还清楚地说明了运行时的唯一 ID。

【讨论】:

  • 谢谢。为了防止线程 ID 回收(如果线程及其句柄可以在跟踪此线程 ID 完成时关闭),可以将其与线程创建 FILETIME 结合起来,这可以通过 GetThreadTimes() API 获得。
  • @user843732:以正确的方式完成,是的,你可以。我使用该技术来检查进程的父 PID 是否表明它是父进程与回收了它的父 PID 的进程。
  • @parrowdice: 一个后续问题,伙计们。 GetThreadTimes() API 返回的FILETIME 计时没有任何与计时器相关的“抖动”,是吗?文档声称线程创建的价值以“100 纳秒时间单位”表示,这是非常精确的!它不会导致内部计时器针对对该 API 的不同调用开始四舍五入,对吗?
  • A FILETIME stuct 始终为 100ns 滴答声。这并不意味着底层 API 实际上会返回相差一个 100ns 滴答的东西。此外,如果在 100ns 内发生某些事情,这些值可能是相同的。说了这么多,你为什么关心这种回收?知道这可能有助于更好地回答这个问题。 (后续问题目前令人担忧。各种警钟目前在我脑海中响起,告诉我我们“太聪明了”。:-])
  • 感谢您的链接! MSDN 在msdn.microsoft.com/en-us/library/windows/desktop/…msdn.microsoft.com/en-us/library/windows/desktop/… 有很多文档,但显然他们选择在文档中隐藏这一重要信息以用于单个功能。 :)
猜你喜欢
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2020-06-30
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
相关资源
最近更新 更多