1. 程式人生 > >控制代碼洩露與CloseHandle

控制代碼洩露與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將永遠成功,這必然會造成程式邏輯上的錯誤。