2013-01-08 26 views
0

我安頓下來使用Wait Functions(WaitForSingleObject的,WaitForMultipleObject等)適當線程退出。在這種情況下,問題是我需要明確調用CloseHandle(線程句柄)以避免內存泄漏或等待函數清理並關閉自己的句柄?在情況下,如果顯式調用CloseHandle需要,我就可以稱之爲「的CreateThread(同一線程處理)再次我將能夠調用GetExitCodeThread()再次等待函數和CloseHandle的依賴

注:??一個計算器問題回答我第二部分說我不能再打電話GetExitCode,但它不明確是否有缺請出了CloseHandle的後內存泄漏等待功能結果還是不行。

回答

2

爲避免內存泄漏,您必須致電CloseHandle。關閉HANDLE後,使用GetExitCodeThreadWaitForSingleObject等功能會導致未定義的行爲。它可能在某些時候有效,但在其他情況下可能會崩潰或返回錯誤答案。作爲Sabotaging yourself: Closing a handle and then using it

解釋雖然這是事實,WaitForSingleObject的給定參數無效時返回WAIT_FAILED,處理回收意味着任何無效的句柄會突然再次有效(但引用一個不相關的對象)。

出於這個原因,它通常是最好的事:

CloseHandle(handle); 
handle = INVALID_HANDLE_VALUE; 

這意味着任何試圖使用手柄將失敗,並顯示相應的錯誤代碼。

一旦您正確清理了手柄,就可以安全地使用它來創建另一個線程。

handle = CreateThread(...); 

現在是分配給你的新線程的句柄,直到你做最後的清理與CloseHandle可以再次調用GetExitCodeThread

0

CloseHandle等待功能方面無關手柄的生命時間。

是的,你需要關閉句柄,無論你應該在哪裏,並且等待函數沒有以任何方式改變它。

與此同時,您只在有效句柄上調用等待函數。否則,你會得到一個錯誤。或者如果您關閉另一個線程上的句柄,則等待函數將退出等待狀態。

+0

謝謝。在CloseHandle()之後調用CreateThread和GetExitCodeThread()怎麼辦?沒有問題 ? –

+2

'CreateThread'可以幫你處理。最終你需要用CloseHandle關閉它。它不必在線程*實際*退出之前或之後。在句柄關閉之前,您可以將它用於'GetExitCodeThread'和其他API函數,包括等待函數。 –

+0

@RomanR:不用,你必須用CloseHandle關閉它。線程句柄是一個資源。不關閉資源的句柄會導致資源泄漏。 – harper