CloseHandle函式的使用

2021-04-28 11:02:40 字數 1891 閱讀 4292

很多程式在建立執行緒都這樣寫的:

............

threadhandle = createthread(null,0,.....);

closehandel(threadhandle );

。。。。。

這不是剛好建立又關閉了嗎?執行緒怎麼執行呢?

closing a thread handle does not terminate the associated thread. to remove a thread object, you must terminate the thread, then close all handles to the thread.

1,執行緒和執行緒控制代碼(handle)不是乙個東西,執行緒是在cpu上執行的.....(說不清楚了),執行緒控制代碼是乙個核心物件。我們可以通過控制代碼來操作執行緒,但是執行緒的生命週期和執行緒控制代碼的生命週期不一樣的。執行緒的生命週期就是執行緒函式從開始執行到return,執行緒控制代碼的生命週期是從 createthread返回到你closehandle()。

2,所有的核心物件(包括執行緒handle)都是系統資源,用了要還的,也就是說用完後一定要closehandle關閉之,如果不這麼做,你系統的控制代碼資源很快就用光了。

3,如果你createthread以後需要對這個執行緒做一些操作,比如改變優先順序,被其他執行緒等待,強制termatethread等,就要儲存這個控制代碼,使用完了在closehandle。如果你開了乙個執行緒,而不需要對它進行如何干預,createthread後直接closehandle就行了。

所以closehandel(threadhandle );

只是關閉了乙個執行緒控制代碼物件,表示我不再使用該控制代碼,即不對這個控制代碼對應的執行緒做任何干預了。並沒有結束執行緒。

如果你覺得多了乙個變數,也可以寫為:

closehandle(createthread(null,0,.....));

《windows核心程式設計》上說呼叫closehandle(handle)表示建立者放棄對該核心物件的操作。如果該物件的引用物件記數為0就撤消該物件。

closehandle的功能是關閉乙個開啟的物件控制代碼,該物件控制代碼可以是執行緒控制代碼,也可以是程序、訊號量等其他核心物件的控制代碼,而exitthread的功能是終止乙個執行緒,它所接受的引數是乙個執行緒的退出碼。  

通過呼叫closehandle可以告知系統,已經完成了對某一核心物件的操作,該函式首先檢查呼叫程序的控制代碼表,來確認程序是否對該控制代碼所指向的物件有訪問權,如果控制代碼無效則返回false,如果有效,系統將得到該核心物件的資料結構的位址,把結構中的使用計數成員減1,如果計數變為0,則將從核心中釋放該核心物件。  

如果計數還未到0,就意味著還有其他的程序在使用這個核心物件,那麼它就不會被釋放。  

exitthread是推薦使用的結束乙個執行緒的方法,當呼叫該函式時,當前執行緒的棧被釋放,然後執行緒終止,相對於terminatethread函式來說,這樣做能夠更好地完成附加在該執行緒上的dll的清除工作。  

如果需要進一步的資訊,您可以參看:  

和http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/prothred_531g.asp  

等有關的msdn資訊。

執行緒作為一種資源建立後不只被建立執行緒引用,我想系統自身為了管理執行緒也會有乙個引用,所以使用者執行緒釋放執行緒控制代碼後,引用計數也不會是零。 引用計數是資源自我管理的一種機制,資源本身以引用計數為零來得知別人不再需要自己,從而把自己kill掉。

createthread後那個執行緒的引用計數不是1,呼叫closehandle只是說自己對這個執行緒沒有興趣了,執行緒還是正常執行的

CloseHandle 函式的使用

很多程式在建立執行緒都這樣寫的 threadhandle createthread null,0,closehandel threadhandle 這不是剛好建立又關閉了嗎?執行緒怎麼執行呢?答 closing a thread handle does not terminate the assoc...

CloseHandle 函式的使用

很多程式在建立執行緒都這樣寫的 threadhandle createthread null,0,closehandel threadhandle 這不是剛好建立又關閉了嗎?執行緒怎麼執行呢?答 closing a thread handle does not terminate the assoc...

CloseHandle 函式的使用

很多程式在建立執行緒都這樣寫的 threadhandle createthread null,0,closehandel threadhandle 這不是剛好建立又關閉了嗎?執行緒怎麼執行呢?答 closing a thread handle does not terminate the assoc...