句柄泄露與CloseHandle

參考:http://www.cnblogs.com/zhwl/archive/2012/11/07/2758212.html

多程序在創建線程都這樣寫的:

......
ThreadHandle = CreateThread(NULL,0,.....);
CloseHandel(ThreadHandle );
......
這不是剛好創建又關閉了嗎?線程怎麼運行呢?
因爲這裏只是"關閉"線程句柄,並不是關閉線程。準確說CloseHandel只是降低了句柄的引用計數。句柄是進程內系統空間和用戶空間交互的紐帶。當用戶申請創建、引用一個Windows資源時(比如窗體、線程、其它內核對象等),Windows會提供一個句柄給用戶,並將該句柄引用計數加1 。用戶可以通過該句柄訪問和使用Windows系統資源。使用完畢後應CloseHandel降低引用計數,通知系統我不用這個資源了。系統會在引用計數爲0時回收句柄(用戶就無法再通過該句柄使用資源了,就是說這個句柄將會失效,至於句柄原先所指的資源系統如何處理,就不需要用戶操心了)

所以,如果你CreateThread以後需要對這個線程做一些操作,比如改變優先級,被其他線程等待,強制TermateThread等,就要保存這個句柄,使用完了在CloseHandle。如果你開了一個線程,而不需要對它進行如何幹預,CreateThread後直接CloseHandle就行了。

如果不及時closehandle,一是會造成句柄的浪費,更重要的是在某些場合會造成程序運行錯誤,比如我使用事件內核同步對象:

CreateEvent
OpenEvent

目的是對兩個進程進行同步,如果其中一個進程被關閉,那麼兩個進程間的交互也就失去意義。但如果沒有CloseHandel,那麼OpenEvent將永遠成功,這必然會造成程序邏輯上的錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章