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()获知失败原因。

 

posted @ 2018-06-04 20:13  AlexBai  阅读(1870)  评论(0编辑  收藏  举报