1. 創建線程是否調用CloseHandle
關於是否在創建線程後調用Closehandle一直困惑,今天查了查,才明白。 CloseHandle關閉句柄並沒有終止新創建的線程。只是表示對新創建的線程的引用不敢興趣,系統會遞減新 線程的線程內核對象的使用計數。當使用計數為0的時候,系統就會釋放線程內核對象。如果在主線程中沒有關閉線程的句柄,始終都會保留一個引用。這樣線程內核對象的引用計數就不會為0。即使新線程執行完畢,線程內核對象也不會被釋放,只有等到進程終止的時候系統才會為 殘留的對象做清理工作。所以應該在不再使用線程的句柄的時候將其關閉掉,讓線程的線程內核對象的引用計數減1
Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, and then close all handles to the thread.
MSDN上的一句話!主線程沒有任何特殊性,主線程退出並不會導致它所創建的線程退出!在Windows上,所有的線程都是平等的,其實沒有什麼主線程和和從屬線程的區別。你可能會說:你說的不對,我的主線程結束了,我的程序就退出了。這是因為我們大部分的程序都是Link了微軟的CRT,主函數由它導入,當main函數結束的時候,CRT會叫到:
ExitProcess
於是所有的線程都同歸於盡了。你感覺上好像其他線程都是主線程給弄沒的。如果你不用CRT,或者是直接用匯編,主線程退出的時候不影響其他的線程。CreateThread需要手動調用CloseHandle關閉句柄
beginthread開啟的線程,在調用_endthread 時候會自動關閉句柄
beginthreadex需要手動關閉句柄如下:CreateThread、ExitThread 不適用於使用了CRT環境的C語言
_beginthread、_endthread 適用於CRT環境,但強烈建議使用ex系列函數代替(_endthread函數會直接關閉線程句柄)
_beginthreadex、_endthreadex 適用於CRT環境
AfxBeginThread、AfxEndThread 適用於MFC環境就算CloseHandle(hThread)但是這個線程沒有return 之前仍然會繼續運行
你CloseHandle後只是對該資源計數器進行--操作當--到0後系統將其回收
2. 【急】C++請問這段多線程代碼為什麼使用了CloseHandle之後在運行時Fun線程還是會運行
CloseHandle並沒有關閉線程 它只是關閉了你的線程句柄 真正的是TerminateProcess()
3. 創建線程後馬上CloseHandle(threadhandle)起什麼作用
摘抄:我在看代碼時發現,如下一段代碼:
HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL);
CloseHandle(threadhandle);
不明白為什麼創建線程後,要馬上把線程的句柄關閉,這樣做的目的是什麼? 這樣做會殺掉線程嗎? 1,線程和線程句柄(Handle)不是一個東西,線程是在cpu上運行的.....(說不清楚了),線程句柄是一個內核對象。我們可以通過句柄來操作線程,但是線程的生命周期和線程句柄的生命周期不一樣的。線程的生命周期就是線程函數從開始執行到return,線程句柄的生命周期是從CreateThread返回到你CloseHandle()。
2,所有的內核對象(包括線程Handle)都是系統資源,用了要還的,也就是說用完後一定要closehandle關閉之,如果不這么做,你系統的句柄資源很快就用光了。 計數減一而已,前提是你再不需要用這個線程句柄,這樣線程結束後,資源立刻被釋放。 內核對象由內核所擁有,而不是由進程所擁有。
在C l o s e H a n d l e 返回之前,它會清除進程的句柄表中的項目,該句柄現在對你的進程已經無效,不應該試圖使用它。無論內核對象是否已 經撤消,都會發生清除操作。當調用C l o s e H a n d l e 函數之後,將不再擁有對內核對象的訪問權,不過,如果該對象的使用計數沒有遞減為 0 ,那麼該對象尚未被撤消。這沒有問題,它只是意味著一個或多個其他進程正在使用該對象。當其他進程停止使用該對象時(通過調用C l o s e H a n d l e ),該對象將被撤消。
4. 為什麼必須要使用CloseHandle關閉句柄
很多程序在創建線程都這樣寫的:
ThreadHandle = CreateThread(NULL,0,.....);
CloseHandel(ThreadHandle );
1,線程和線程句柄(Handle)不是一個東西,線程是在內cpu上運行的.....(說不清容楚了),線程句柄是一個內核對象。我們可以通過句柄來操作線程,但是線程的生命周期和線程句柄的生命周期不一樣的。線程的生命周期就是線程函數從開始執行到return,線程句柄的生命周期是從CreateThread返回到你CloseHandle()。
2,線程句柄是一種內核對象,系統維護著每一個內核對象,當每個內核對象引用記數為0時,系統就從內存中釋放該對象,CloseHandle就是將該線程對象的引用記數減1。所有的內核對象(包括線程Handle)都是系統資源,用了要還的,也就是說用完後一定要closehandle關閉之,如果不這么做,你系統的句柄資源很快就用光了。
只是關閉了一個線程句柄對象,表示我不再使用該句柄,即不對這個句柄對應的線程做任何干預了。並沒有結束線程。
5. CreateThread後調用CloseHandle,線程函數為什麼仍在執行
CreateThread函數已經開啟了線程,反回了現成的HANDLE。如果程序中不需要用到該線程的版句柄,就可以使用CloseHandle將線權程句柄釋放。CloseHandle只是將句柄釋放,並未將線程關閉。
6. 在對多線程調用closehandle(hsem)時,程序出錯,求助!!!!
在對多線程調用closehandle(hsem)時,程序出錯,求助!!!!首先提示:異常:訪問內存內地址沖突 project inter.exe raised exception class eexternalexception with message 'external exception c0000008'.process stopped.use step or run to continue.然後是:容調用WINAPI出錯: project inter.exe raised exception class ewin32error with message 'win32error. code:5. 拒絕訪問。'.process stopped.use step or run to continue.請高手指教!
7. 請教一個線程創建後立刻用CloseHandle()函數,那麼這個線程關閉了嗎
沒有關閉,只是關閉了它產生的句柄。線程函數ruturn才關閉,或者你TerminateThread
8. 創建線程後為什麼馬上調用CloseHandle來關閉句柄
ead = CreateThread( NULL, 0, ThreadFunc, NULL, 0, &dwThreadId);
CloseHandle(hThread);
如上面這樣的代碼,原因為:創建線程後返回了線程句柄,新創建的線內程內核對象的使用容計數是2,一個是線程本身,一個是創建線程的線程,創建線程的線程closehandle後,新的線程的內核對象使用計數為1,當這個新線程結束運行後內核對象的使用計數還要減1,這時內核對象的使用計數是0,則系統會自動刪除新線程的內核對象,這是正常的處理流程。
如果不調用CloseHandle();則新線程運行結束後,由於使用計數為1,所以不會刪除線程內核對象,這樣就會造成內存泄漏。當然在整個程序運行結束後,操作系統會回收這些內存,因此可以知道如果不調用CloseHandle()的話,在程序運行階段會造成內存泄漏!