今天在測試程序的時候,在【任務管理器】中發現進程序的句柄隨着多線程的不斷運行,會不斷的 +1。
發現原來在我的代碼中,啟動線程后都沒有顯式的調用 CloseHandle() 來關閉線程句柄。
當我准備寫關柄句柄的代碼時,我有個疑問,如果線程還沒有結束的時候,使用 CloseHandle() 來關閉線程句柄,是否會影響線程的運行呢?
百度了一下,找到答案:https://blog.csdn.net/rainminism/article/details/8509857
內容就直接復制過來,也不算多:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
_beginthreadex 函數返回一個線程句柄
返回這個handle是為了讓你有機會對這個線程實施外部動作,諸如waitforsingleobject之類。
CloseHandel(_beginthreadex);
只是關閉了一個線程句柄對象,表示我不再使用該句柄,即不對這個句柄對應的線程做任何干預了。並沒有結束線程。
CloseHandle的功能是關閉一個打開的對象句柄,該對象句柄可以是線程句柄,也可以是進程、信號量等其他內核對象的句柄,而_endthreadex的功能是終止一個線程,它所接受的參數是一個線程的退出碼。
通過調用CloseHandle可以告知系統,已經完成了對某一內核對象的操作,該函數首先檢查調用進程的句柄表,來確認進程是否對該句柄所指向的對象有訪問權,如果句柄無效則返回FALSE,如果有效,系統將得到該內核對象的數據結構的地址,把結構中的使用計數成員減1,如果計數變為0,則將從內核中釋放該內核對象。如果計數還未到0,就意味着還有其他的進程在使用這個內核對象,那么它就不會被釋放。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是改進后的代碼:
HANDLE hThread = (HANDLE) _beginthreadex(NULL, 0, thread_worker, NULL, 0, NULL); if(hThread != NULL) { CloseHandle(hThread); //只是關閉線程句柄, 並沒有結束線程. }
這樣每次啟動線程后,進程中的句柄不會 +1
