如何在某个线程内终止另一个正在运行的线程?
1.利用TerminateThread() 放弃一个线程
BOOL TerminateThread(
HANDLE hThread,
DWORD dwExitCode
);
参数
hThread 欲令其结束之线程的 handle。该线程就是我们的行动目标。
dwExitCode 该线程的结束代码。
返回值
如果函数成功,则传回 TRUE。如果失败,则传回 FALSE。GetLastError()可以获知更多细节。
TerminateThread() 看起来不错,但是“TerminateThread() 是一个危险的函数,应该在最不得已的情况下才使用”。
TerminateThread() 强迫其行动目标(一个线程)结束,手段激烈而有力,甚至不允许该线程有任何“挣扎”的机会。这带来的副作用便是,线程没有机会在结束前清理自己。对线程而言,这可能导致前功尽弃。这个函数不会在目标线程中丢出一个异常情况(exception),目标线程在核心层面就被根本抹杀了。目标线程没有机会捕捉所谓的“结束请求”,并从而获得清理自己的机会。
还有另一个令人不愉快的情况。目标线程的堆栈没有被释放掉,于是可能会引起一大块内存泄(memory leak)。而且,任何一个与此线程有附着关系的 DLLs 也都没有机会获得“线程解除附着”的通知。
此函数唯一可以预期并依恃的是,线程 handle 将变成激发状态(译注:因为线程结束了),并且传回 dwExitCode 所指定的结束代码。
这个函数所带来的隐伏危机还包括:如果线程正进入一个 critical section之中,该 critical section 将因此永远处于锁定状态,因为 critical section 不像mutex 那样有所谓的 "abandoned" 状态。如果目标线程正在更新一份数据结构,这份数据结构也将永远处于不稳定状态。没有任何方法可以阻止这些问题的发生。所以离TerminateThread() 远远地!
2.使用信号(Signals)
下一个似乎可行的想法是使用 signals。在 Unix 系统中,signals 是跨进程传送通告(notifications)的标准方法。在 Unix 系统中 SIGTERM 相当于“请你离开”的意思ÿ