【发布时间】:2012-11-27 17:20:45
【问题描述】:
比如说,如果我有一个线程 ID,我可以确保它在每个进程或整个操作系统(在所有登录用户中)都是唯一的(只要线程正在运行)?
【问题讨论】:
-
一旦您知道线程在其生命周期内可以在不同的内核/处理器上运行并且 ID 在此期间将保持不变,您就可以自己推断答案 ;-)
标签: c++ multithreading winapi thread-safety
比如说,如果我有一个线程 ID,我可以确保它在每个进程或整个操作系统(在所有登录用户中)都是唯一的(只要线程正在运行)?
【问题讨论】:
标签: c++ multithreading winapi thread-safety
是的,Windows 上的线程 ID 和进程 ID 是从同一个池中分配的,因此它们是唯一的。但是,一旦线程或进程结束,该 ID 可能会被另一个线程或进程重新使用。
【讨论】:
hThread1 = CreateThread(...&tid1); CloseHandle(hThread1); hThread2 = CreateThread(...&tid2); // tid1 == tid2, even hThread1 == hThread2 虽然它们现在引用不同的内核对象。
线程由内核对象表示,例如在 Windows 平台上。因此,它的 id 在所有登录会话的所有进程中都是唯一的。但是线程ID可以在线程内核对象关闭后回收。
GetCurrentThreadId 还清楚地说明了运行时的唯一 ID。
【讨论】:
FILETIME 计时没有任何与计时器相关的“抖动”,是吗?文档声称线程创建的价值以“100 纳秒时间单位”表示,这是非常精确的!它不会导致内部计时器针对对该 API 的不同调用开始四舍五入,对吗?
FILETIME stuct 始终为 100ns 滴答声。这并不意味着底层 API 实际上会返回相差一个 100ns 滴答的东西。此外,如果在 100ns 内发生某些事情,这些值可能是相同的。说了这么多,你为什么关心这种回收?知道这可能有助于更好地回答这个问题。 (后续问题目前令人担忧。各种警钟目前在我脑海中响起,告诉我我们“太聪明了”。:-])