Windows下的线程可以通过以下4种方法来终止。
1、 线程函数返回。(强烈推荐)
2、 线程通过调用ExitThread函数“杀死”自己。(避免使用)
3、 同一个进程或另一个进程中的线程调用TerminateThread函数(避免使用)
4、 包含线程的进程终止运行(避免使用)
1)、线程函数返回(自然死亡)
清理工作包括:C++对象被析构函数正确销毁、线程栈正确释放、线程函数返回值被设置为退出代码、减少线程内核对象引用计数。
2)、通过调用ExitThread函数(做好部分后事的自杀)
清理工作除了不包括释放C/C++资源(调用C++对象的析构函数销毁)之外,同上。因此,要避免使用这一种方法。
3)、通过调用TerminateThread函数(无意识的自杀或者他杀,这是一种谋杀)
调用TerminateThread杀死线程,被终止运行的线程收不到它被“杀死”的通知(DLL_THREAD_DETACH通知),所以线程无法正确清理,而且不能阻止自己被终止运行。
清理工作除了不包括释放C/C++资源(调用C++对象的析构函数销毁),还有线程堆栈也不会销毁,除非包含该线程的进程终止,这样做的原因是为了让其他还在运行的线程要引用被“杀死”的那个线程的堆栈上的值。其余同上。因此,要避免使用这一种方法。
PS:以上总结绝大部分来来自《Windows核心编程 5th》