1. 程式人生 > >建立執行緒後為什麼關閉了執行緒控制代碼,執行緒還是可以執行?

建立執行緒後為什麼關閉了執行緒控制代碼,執行緒還是可以執行?

主執行緒只要擁有執行緒控制代碼,事後就可以對執行緒執行某些操作,比如查詢執行緒狀態等等,靠的就是控制代碼,如果沒有控制代碼,系統就無從知道要查的是那個執行緒的狀態。但保持這個控制代碼不關閉,並不是執行緒執行的條件。

        關閉執行緒控制代碼只是釋放控制代碼資源,新開啟執行緒後,如果不再利用其控制代碼,應該關閉控制代碼,釋放系統資源。關閉執行緒控制代碼和執行緒的結束與否沒有關係。

       控制代碼可以認為是系統對資源(如執行緒)的分配的一個編號。關閉這個編號,對於不同的資源,效果不盡相同。對於執行緒來說,關閉這個編號並不意味著終止執行緒,只是之後很難再操縱這個執行緒。這就好比摘掉了門牌號,並不傷害這一家人,只是以後往這送信就麻煩些了。還有,如果主執行緒只想建立執行緒,而並不想之後再查詢或操縱它,那麼及時關閉控制代碼是個好習慣,免得當時沒關,以後又忘了,於是洩漏了系統的控制代碼資源(系統控制代碼總數是有限的)。

       如果知道引用計數是怎麼回事就很好解釋了。CloseHandle(hThread)   只是減去一個hThread的引用計數。

       執行緒控制代碼就像你家的地址,執行緒就像你的家房子,你說如果沒有了你家的地址,難道就沒有你家的房子了嗎?   
執行緒與執行緒控制代碼也是一樣的道理,控制代碼只是可以對這個執行緒作一些操作。


        CloseHandle是關閉執行緒控制代碼,用來釋放執行緒資源的,不是終止執行緒的.執行緒的終止用terminatethread或exitthread,TerminateThread的使用會導致各類資源釋放問題,主要是與該執行緒相連的各類dll,他們無法得到執行緒退出的通知。應該線上程中自然退出(即隱式呼叫ExitThread)或直接顯式呼叫ExitThread。退出的時機應由同步物件或其他機制來實現,而且主執行緒一般應使用WaitForSingleObject函式等待該執行緒的控制代碼,以確保執行緒的退出。 希望對你有幫助 ......

轉自:https://blog.csdn.net/laoyang360/article/details/7691366