线程创建后,立刻调用CloseHandle的原因
HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL);
CloseHandle(threadhandle);
不明白为什么创建线程后,要马上把线程的句柄关闭,这样做的目的是什么? 这样做会杀掉线程吗?
解答:
当调用CloseHandle()后,其实并没有真正的销毁句柄。解释如下,
创建线程后返回了线程句柄,新创建的线程内核对象的使用计数是2,一个是线程本身,一个是创建线程的线程,创建线程的线程closehandle后,新的线程的内核对象使用计数为1,当这个新线程结束运行后内核对象的使用计数还要减1,这时内核对象的使用计数是0,则系统会自动删除新线程的内核对象,这是正常的处理流程。
你如果不显示的调用closehandle,则新线程结束运行后,由于内核对象使用计数为1,所以不会删除内核对象,会造成内存泄露,不过当整个进程结束时操作系统会自动关闭该进程的所有的内核对象包括这个新线程的内核对象,所以你不调用closehandle问题不大,只是在你的进程运行的时候会造成内存泄露,进程结束后系统是会自动清理的。
在王艳平的《Windows程序设计》中,对closehandle()具体解释:
每次createthread()创建线程对象的时候,线程对象中Usage count的初始化值为2(注意不是1)
closehandle()能是Usage count的值减少1,这个时候Usage count的值为1,所以并没有销毁,只有
当线程执行的函数通过return结束的时候,Usage count继续减少1变为0,这个时候才真正的销毁对象