CloseHandel(_beginthreadex): 只是关闭了线程句柄对象,并不会结束线程。

今天在测试程序的时候,在【任务管理器】中发现进程序的句柄随着多线程的不断运行,会不断的 +1。

发现原来在我的代码中,启动线程后都没有显式的调用 CloseHandle() 来关闭线程句柄。

当我准备写关柄句柄的代码时,我有个疑问,如果线程还没有结束的时候,使用 CloseHandle() 来关闭线程句柄,是否会影响线程的运行呢?

百度了一下,找到答案:https://blog.csdn.net/rainminism/article/details/8509857

内容就直接复制过来,也不算多:

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

_beginthreadex 函数返回一个线程句柄 

返回这个handle是为了让你有机会对这个线程实施外部动作,诸如waitforsingleobject之类。 

 

CloseHandel(_beginthreadex);

只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。

 

CloseHandle的功能是关闭一个打开的对象句柄,该对象句柄可以是线程句柄,也可以是进程、信号量等其他内核对象的句柄,而_endthreadex的功能是终止一个线程,它所接受的参数是一个线程的退出码。   
    
通过调用CloseHandle可以告知系统,已经完成了对某一内核对象的操作,该函数首先检查调用进程的句柄表,来确认进程是否对该句柄所指向的对象有访问权,如果句柄无效则返回FALSE,如果有效,系统将得到该内核对象的数据结构的地址,把结构中的使用计数成员减1,如果计数变为0,则将从内核中释放该内核对象。如果计数还未到0,就意味着还有其他的进程在使用这个内核对象,那么它就不会被释放。   

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

下面是改进后的代码:

HANDLE hThread = (HANDLE) _beginthreadex(NULL, 0, thread_worker, NULL, 0, NULL);
if(hThread != NULL)
{
    CloseHandle(hThread); //只是关闭线程句柄, 并没有结束线程.
}

 

这样每次启动线程后,进程中的句柄不会 +1

 

posted @ 2018-09-11 13:44  personnel  阅读(2108)  评论(0编辑  收藏  举报
友情链接:图片批量处理工具 gif动态图制作工具 制作电子相册 图片排版工具 制作淘宝主图视频 MKScript 鼠标键盘自动化脚本语言