最近看一段程序,在創建線程時是這樣寫的:
。。。。。。
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()獲知失敗原因。
