今天看到一段这样的代码
HANDLE hThread = CreateThread(NULL, 0, add, &a, 0, NULL);
hmutext = CreateMutex(NULL, false, L"huchiti");
CloseHandle(hThread);
刚刚创建线程,居然关闭了。。。百思不得其解。。。
百度之下,还扯出了线程的生命周期的问题。。。
线程和线程句柄
简单的说,关闭了线程句柄 != 关闭了线程,其两者的生命周期并不同步。
线程句柄的类型是什么呢,VC源码里面这样写到 typedef void* HANDLE;可以简单的把线程句柄看成是可以指向任何类型的指针,通过线程句柄来操控线程;
线程的生命周期:线程函数开始执行到return
线程句柄的生命周期:CreateThread() -> CLoseHandle()
在线程创建后马上调用CloseHandle()是个良好的做法,这里不会影响线程的执行,就是因为即使你close了这个handle,它的内部记数也不为零. 但如果你不关,在线程结束后,那个线程对象将滞留于内存中,也就是说你有handle leak.