我對使用從_beginthreadex()
返回的手柄不感興趣。立即撥打CloseHandle()
是否安全?_beginthreadex()成功後可以立即調用CloseHandle()嗎?
我相信這一定是爲了避免內存泄漏。
我對使用從_beginthreadex()
返回的手柄不感興趣。立即撥打CloseHandle()
是否安全?_beginthreadex()成功後可以立即調用CloseHandle()嗎?
我相信這一定是爲了避免內存泄漏。
是的,只要您決定不再需要該手柄,您就可以關閉手柄。這不會影響線程執行。但是,在繼續之前,您可能應該檢查線程是否已啓動。
您關心的泄漏不是內存泄漏,它們是系統資源泄漏 - 通常它們更糟糕。
謝謝。確定新創建的線程是否真正開始的最好方法是什麼? – user1061590
@ user1061590:沒有「最好」的方法,但我認爲你應該檢查'_beginthreadex()'返回的值以確保它成功。 – sharptooth
根據MSDN,你不應該附近__beginThreadEx返回的句柄: _endthread自動關閉線程處理(而_endthreadex沒有)。因此,使用_beginthread和_endthread時,並沒有明確通過調用關閉線程處理Win32 CloseHandle API。 (詳情請參見http://msdn.microsoft.com/en-us/library/kdzttdcb(ar-sa).aspx)。
這部分討論了不同的功能。 「當使用** _ beginthread **和_endthread時,不要明確地關閉線程句柄'vs」由_beginthreadex調用者關閉** _ beginthreadex **返回的句柄 –
感謝您指出,它有助於^ _ ^ – YoungLearner
您需要最終關閉句柄以避免資源泄漏,但在啓動線程後立即執行該操作,您無法選擇使用句柄同步(等待)線程完成。是的,這是安全的。 –
即使您立即關閉由_beginthreadex返回的句柄,仍有另一種方式與線程同步。線程本身可以通過GetCurrentThreadId訪問其線程ID並將其傳遞給主線程。然後,您可以始終調用OpenThread(具有SYNCHRONIZE權限)從該線程ID獲取新句柄。 –