2013-02-13 22 views
2

如果我有一個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文檔或權威書籍明確指出其中之一?

回答

6

需要注意的是:

因此,一個標識符只能在最後一個線程手後重新使用le是封閉的(也就是說,你的假設是正確的)。

+0

好吧。嗯。 (1)真的說相反(「直到...終止」),不是嗎? /(2)是的,我正在尋找一個來源。你是否有一個? /(3)是的,所有API暗示某種程度上答案似乎是肯定的。 – 2013-02-14 09:09:22

+0

這不是相反的,而是不準確的。假如反向句柄查找在完成的ThreadProc上仍然有效,線程標識符生存期與krrnel對象本身的相同。 – 2013-02-14 09:38:22

+0

你能提供一個引用來支持你的第二點:線程標識符保持不變,直到該線程的最後一個句柄被關閉? – 2017-02-07 18:45:52

相關問題