本文讨论如何在某个线程内终止另一个正在运行的线程或者在一个线程中控制其他线程类似问题
方法一:利用 TerminateThread() 放弃一个线程
“TerminateThread() 是一个危险的函数, 应该在最不得已的情况下才使用”。
缺点:
- 目标线程结束前无法释放堆栈,可能造成内存泄漏
- 如果线程在一个critical section中,则该critical section也将永远处于锁定,死锁了。
方法二:跨越线程,丢出异常情况(Exceptions)
“模拟丢出一个异常情况到另一个线程”,但Win32 API 中没有什么标准方法可以把一个异常情况丢到另一个线程中。
技术之一是利用 debugging API 写一个不合法的指令到目标线程的目前地址上。另一种做法是改变一个常用的指针,使它指向一个不合法地址,因而强迫程序代码产生一个异常情况。这两种做法都有缺点,但当你别无它途时,不妨一试。【待试一试】
方法三:设立一个标记
优点:保证目标线程结束之前安全而一致的状态。
缺点:线程需要时时检查标记值,可使用一个手动重置的event对象,检查其状态或者等待它。
Event方法具体实现:
产生两个线程,目标线程周期性地检查一个 event 对象(全局变量),以决定要不要结束自己。
如下摘录的例子,计算PI, 很有意思。