CloseHandle()函數小記


最近看一段程序,在創建線程時是這樣寫的:

。。。。。。
HANDLE hThread = CreateThread(NULL,0,StartServProc,pServPara,0,&dwThreadId); CloseHandle(hThread);
。。。。。。

有一個疑問:這不是剛創建完線程,又關閉了嗎。

查找相關資料,終於弄清楚是怎么回事,記錄在此。

*******************************************************************************************************************

1. 線程和線程句柄(Handle)不是一個東西,線程是CPU上跑起來的一段程序,線程句柄是一個內核對象。我們可以通過句柄來操作線程,但是線程的生命周期和線程句柄的生命周期不一樣的。線程的生命周期就是線程函數從開始執行到結束,線程句柄的生命周期是從CreateThread返回到你CloseHandle()。

2. 所有的內核對象(包括線程Handle)都是系統資源,申請用完之后要釋放返還的,也就是說用完后一定要closehandle關閉線程句柄,如果不這么做,會造成句柄泄露,系統的句柄資源很快就用光了。

3. 如果CreateThread以后需要對這個線程做一些操作,比如改變優先級,被其他線程等待,強制TermateThread等,就要保存這個句柄,使用完了在CloseHandle。

如果你開了一個線程,而不需要對它進行如何干預,CreateThread后直接CloseHandle就行了。

所以CloseHandle(hThread );

只是關閉了一個線程句柄對象,表示我不再使用該句柄,即不對這個句柄對應的線程做任何干預了,並沒有結束該線程。該線程照常運行,直到滿足條件結束。
********************************************************************************************************************

CreateThread函數原型:

HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,      //SD
    SIZE_T dwStackSize,                            //initialstacksize
    LPTHREAD_START_ROUTINE lpStartAddress,         //threadfunction
    LPVOID lpParameter,                            //threadargument
    DWORD dwCreationFlags,                         //creationoption
    LPDWORD lpThreadId                             //threadidentifier
)

參數:

lpThreadAttributes:指向SECURITY_ATTRIBUTES型態的結構的指針。在Windows NT中,NULL使用默認安全性,不可以被子線程繼承,否則需要定義一個結構體將它的bInheritHandle成員初始化為TRUE

dwStackSize:設置初始棧的大小,以字節為單位,如果為0,那么默認將使用與調用該函數的線程相同的棧空間大小。

lpStartAddress:指向線程函數的指針。

lpParameter:向線程函數傳遞的參數,是一個指向結構的指針,不需傳遞參數時,為NULL。

dwCreationFlags :線程標志,可取值如下:

(1)CREATE_SUSPENDED(0x00000004):創建一個掛起的線程,

(2)0:表示創建后立即激活。

(3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize參數指定初始的保留堆棧的大小,否則,dwStackSize指定提交的大小。

lpThreadId:保存新線程的id。

返回值:

函數成功,返回線程句柄;函數失敗,返回NULL。

------------------------------------------------------------------------------------

CloseHandle函數原型:

BOOL CloseHandle(HANDLE hObject);

參數:

hObject :代表一個已打開對象的handle。

返回值:

TRUE:執行成功;

FALSE:執行失敗,可以調用GetLastError()獲知失敗原因。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM