今天在测试程序的时候,在【任务管理器】中发现进程序的句柄随着多线程的不断运行,会不断的 +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