2012-12-10 31 views
14

說,如果我有一個線程ID,我可以確信,每個進程或整個操作系統(在所有登錄用戶中)它將是唯一的(線程運行的時間)?每個進程或每臺計算機的線程ID是唯一的嗎?

+0

一旦您知道一個線程可以在其生命週期內的不同核心/處理器上運行,並且在此期間ID將保持不變,您可以自己推斷出答案;-) –

回答

11

是的,Windows上的線程ID和進程ID是從同一個池中分配的,因此它們將是唯一的。但是,一旦線程或進程結束,該ID可能會被另一個線程或進程重新使用。

+2

是的,謝謝。我知道PID是唯一的。我不確定線程​​ID。 – c00000fd

+0

您可以擴展您的答案來解釋線程ID或進程ID多久可以循環使用嗎? –

+0

@ChristopherOezbek只要內核對象關閉,它的ID就可以重新使用。因此,下面是完全可能的:'hThread1 = CreateThread(... &tid1); CloseHandle(hThread1); hThread2 = CreateThread(... &tid2); // tid1 == tid2,即使hThread1 == hThread2'雖然他們現在指的是不同的內核對象 – parrowdice

8

線程由內核對象表示,例如,在Windows平臺上。因此,它在所有登錄會話的所有進程中都是唯一的。但是,線程ID可以在線程內核對象關閉後被回收。

GetCurrentThreadId也清楚地說明了運行時的唯一ID。

+0

爲了防止線程ID回收(如果線程及其句柄可以在跟蹤該線程標識完成的情況下關閉),可以將其與創建線程的FILETIME結合使用,這可以通過GetThreadTimes()API獲得 – c00000fd

+0

@ user843732 :以正確的方式完成,是的,你可以,我使用這種技術來檢查一個進程的父PID是否指示它的父進程與已經回收它的父進程PID的進程 – parrowdice

+0

@parrowdice:一個後續問題,傢伙。由GetThreadTimes()API返回的FILETIME定時器沒有任何與定時器有關的「抖動」,這是否?該文檔聲稱創建線程的值以「100-ns ime單位「這是非常精確的!它不會導致內部計時器開始四捨五入來處理對該API的不同調用,是不是? – c00000fd

相關問題