CloseHandle()函数小记
Posted alexbai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()获知失败原因。
以上是关于CloseHandle()函数小记的主要内容,如果未能解决你的问题,请参考以下文章
CWinThread类,使用后要不要使用CloseHandle释放内核
如果未使用 CloseHandle 正确关闭,则重新打开串行端口失败
作业对象上的 CloseHandle() 但不终止由 ShellExecute 创建的进程