我在看代码时发现,如下一段代码:HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL);
CloseHandle(threadhandle);不明白为什么创建线程后,要马上把线程的句柄关闭,这样做的目的是什么? 这样做会杀掉线程吗?
CloseHandle(threadhandle);不明白为什么创建线程后,要马上把线程的句柄关闭,这样做的目的是什么? 这样做会杀掉线程吗?
调试欢乐多
1 HANDLE CreateThread(
2 PSECURITY_ATTRIBUTES psa,
3 DWORD dwStackSize,
4 PTHREAD_START_ROUTINE pfnStartAddr,
5 PVOID pvParam,
6 DWORD dwCreationFlags,
7 PDWORD pdwfhreadId);
8 关闭内核对象
不论通过何种方式创建内核对象,都通过调用CloseHandle方法来结束对内核对象的操作。
BOOL CloseHandle(HANDLE hobj);
为什么结束进程能释放所有占用的资源?进程在运行时有可能出现内存泄漏。在进程终止运行时,系统会自动扫描进程的句柄表。若表中拥有任何无效项目(进程终止前没关闭的对象),系统将关闭这些对象的句柄。对象的计数器被置0,内核便会撤销这些对象。
HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL);
CloseHandle(threadhandle);
threadhandle = NULL;
你如果不显示的调用closehandle,则新线程结束运行后,由于内核对象使用计数为1,所以不会删除内核对象,会造成内存泄露,不过当整个进程结束时操作系统会自动关闭该进程的所有的内核对象包括这个新线程的内核对象,所以你不调用closehandle问题不大,只是在你的进程运行的时候会造成内存泄露,进程结束后系统是会自动清理的。
threadhandle 等同于 OpenThread 一个线程ID