线程退出的顺序问题
在开发过程中经常遇到线程退出异常的情况。今天看到了一篇《线程句柄HANDLE与线程ID的关系》博客里面详细介绍了线程句柄与线程ID之间的关系以及线程退出的顺序等问题。特此记录一下有关线程退出的顺序问题。
线程退出的时候内核对象就会被激发, WaitForSingleObject()为堵塞函数,等待线程的内核对象被激发。所以终止线程并释放句柄对象的顺序是:TerminateThread()-->WaitForSingleObject()-->CloseHandle().
//线程、线程句柄、线程ID的生成和消失
hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &dwId); //至此,新线程,线程句柄,线程ID产生
TerminateThread(hThread, 0); //至此,线程ID,线程句柄都依然存在
WaitForSingleObject(hThread, INFINITE); //至此,线程本身和线程ID消失
CloseHandle(hThread); //至此,线程句柄消失