2011-11-23 47 views
6

我對使用從_beginthreadex()返回的手柄不感興趣。立即撥打CloseHandle()是否安全?_beginthreadex()成功後可以立即調用CloseHandle()嗎?

我相信這一定是爲了避免內存泄漏。

+1

您需要最終關閉句柄以避免資源泄漏,但在啓動線程後立即執行該操作,您無法選擇使用句柄同步(等待)線程完成。是的,這是安全的。 –

+0

即使您立即關閉由_beginthreadex返回的句柄,仍有另一種方式與線程同步。線程本身可以通過GetCurrentThreadId訪問其線程ID並將其傳遞給主線程。然後,您可以始終調用OpenThread(具有SYNCHRONIZE權限)從該線程ID獲取新句柄。 –

回答

9

是的,只要您決定不再需要該手柄,您就可以關閉手柄。這不會影響線程執行。但是,在繼續之前,您可能應該檢查線程是否已啓動。

您關心的泄漏不是內存泄漏,它們是系統資源泄漏 - 通常它們更糟糕。

+0

謝謝。確定新創建的線程是否真正開始的最好方法是什麼? – user1061590

+0

@ user1061590:沒有「最好」的方法,但我認爲你應該檢查'_beginthreadex()'返回的值以確保它成功。 – sharptooth

-1

根據MSDN,你不應該附近__beginThreadEx返回的句柄: _endthread自動關閉線程處理(而_endthreadex沒有)。因此,使用_beginthread和_endthread時,並沒有明確通過調用關閉線程處理Win32 CloseHandle API。 (詳情請參見http://msdn.microsoft.com/en-us/library/kdzttdcb(ar-sa).aspx)。

+1

這部分討論了不同的功能。 「當使用** _ beginthread **和_endthread時,不要明確地關閉線程句柄'vs」由_beginthreadex調用者關閉** _ beginthreadex **返回的句柄 –

+0

感謝您指出,它有助於^ _ ^ – YoungLearner

相關問題