这个问题是:
我如何在某个线程内终止另一个正在运行的线程?
TerminateThread() 强迫其行动目标(一个线程)结束,手段激烈而有力,甚至不允许该线程有任何“挣扎”的机会。这带来的副作用便是,线程没有机会在结束前清理自己。
对线程而言,这可能导致前功尽弃。这个函数不会在目标线程中丢出一个异常情况( exception),目标线程在核心层面就被根本抹杀了。目标线程没有机会捕捉所谓的“结束请求”,并从而获得清理自己的机会。
还有另一个令人不愉快的情况。目标线程的堆栈没有被释放掉,于是可能会引起一大块内存泄漏( memory leak)。而且,任何一个与此线程有附着关系的 DLLs 也都没有机会获得“线程解除附着”的通知。
这个函数所带来的隐伏危机还包括: 如果线程正进入一个 critical section之中,该critical section 将因此永远处于锁定状态。
我的结论是:离 Term inateThread() 远远地!
正确的方法:
设立一个标记
当所有方法都失败时,不妨返朴归真,回到最简单最明白的路上。 Win32 核准的做法是在你的程序代码中设立一个标记,利用其值来要求线程结束自己。
在京麦代码中,使用的是一个bool变量。在子线程的run()函数中,在几个需要长时间操作之前,先检查下该bool变量的值。
如果该bool值为false了,那么子线程直接就退出。
主线程通过子线程的setValue()方法,改变该bool值。
当然setValue()方法和run()方法中,对该bool值的访问都必须要加锁。
因为主线程中,会调用setValue()方法改变该bool值。