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 吗?

作业对象上的 CloseHandle() 但不终止由 ShellExecute 创建的进程

java学习中,匿名函数构造方法构造代码块构造方法中调用构造方法(java 学习中的小记录)

互斥体上的 CloseHandle,在 ReleaseMutex 之前 - 会发生啥?