前面章节介绍了线程创建等过程,现在的问题是:如何在某个线程内终止另外一个正在运行的线程?
windows核心编程中提到终止运行线程的方法:
1)线程函数自己返回;
2)线程通过调用ExitThread函数“杀死”自己,该函数将终止线程的运行并导致操作系统清理该线程使用的所有操作系统资源,但是使用的C/C++资源不会被销毁(慎用);
3)调用TerminateThread函数,不同于ExitThread总是“杀死”主调线程,TreminateThread能杀死任何线程。但是TerminateThread函数时异步的,它告诉系统你想终止线程,但在函数返回时并不能保证线程已经终止了,线程无法正确清理(慎用)。
本章中提到的做法是:使用一个手动重置的Event对象,线程检查该Event对象的状态或是等待它,举例说明。
//线程退出事件 HANDLE hExitEvent = null ; //一个需要长时间运行的线程 DWORD WINAPI ThreadFun ( LPVOID p ) { for ( int i =0 ; i < 1000000; i++ ){ //判断线程是否要被强制结束 /* 可能在这里大家有点疑惑,如果没有调用 SetEvent()的方法, hExitEvent 不是总处于未激发状态吗?哪线程不就停在这里不动了? 答案是:这里用到了 P74提到的一个Wait… ()一个用法,当time_out 为,检查hExitEvent的状态,如果 hExitEvent处于未激发状态, 立刻返回WAIT_TIMEOUT,如果 hExitEvent处于激发状态,则立刻 返回WAIT_OBJECT_0。 */ if ( WaitForSingleObject ( hExitEvent , 0 ) !=WAIT_TIMEOUT ){ //做一些退出线程前的清理工作 return (DWORD) -1 ; } //做一些极其消耗时间的处理… //…… //…… } } void main() { HANDLE hThrd; //构造EVENT 核心对象,初始状态处于未激发状态, Manual方式 hExitEvent = CreateEvent ( NULL,TRUE,FALSE,NULL ) ; //线程启动 hThrd = CreateThread ( null,ThreadFun, …); Sleep(1000); //等待 SetEvent ( hExitEvent ) ;//等待了很久,实在等不下去了,发出结束线程退出事件(激发 EVENT核心对象),迫使线程结束 //等待线程结束 WaitForSingleObject (hThrd, …); CloseHandle ( hThrd ); }
大致的一个过程就是下图所示:
接下来就是线程优先权,调整线程优先权很简单,无非就是用SetThreadPriority()和GetThreadPriority()等函数。但如何有效,合理的调整线程的优先权却是一个复杂的问题,正如书上所说,“如果你的目标是保持简单,那就还是避免处理[优先权]这个烫山芋吧“。