《Win32多线程程序设计》之线程终止

本文探讨了在Win32环境下安全终止多线程的三种方法:避免使用危险的TerminateThread(),尝试通过异常模拟终止,以及设置标记配合event对象。每个方法的优缺点都进行了分析,强调了线程安全终止的重要性,特别是在维护内存管理和避免死锁方面。
摘要由CSDN通过智能技术生成

本文讨论如何在某个线程内终止另一个正在运行的线程或者在一个线程中控制其他线程类似问题

方法一:利用 TerminateThread() 放弃一个线程
“TerminateThread() 是一个危险的函数, 应该在最不得已的情况下才使用”。
缺点:
- 目标线程结束前无法释放堆栈,可能造成内存泄漏
- 如果线程在一个critical section中,则该critical section也将永远处于锁定,死锁了。

方法二:跨越线程,丢出异常情况(Exceptions)
“模拟丢出一个异常情况到另一个线程”,但Win32 API 中没有什么标准方法可以把一个异常情况丢到另一个线程中。
技术之一是利用 debugging API 写一个不合法的指令到目标线程的目前地址上。另一种做法是改变一个常用的指针,使它指向一个不合法地址,因而强迫程序代码产生一个异常情况。这两种做法都有缺点,但当你别无它途时,不妨一试。【待试一试】

方法三:设立一个标记
优点:保证目标线程结束之前安全而一致的状态。
缺点:线程需要时时检查标记值,可使用一个手动重置的event对象,检查其状态或者等待它。

Event方法具体实现:
产生两个线程,目标线程周期性地检查一个 event 对象(全局变量),以决定要不要结束自己。
如下摘录的例子,计算PI, 很有意思。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值