Win32线程——在某个线程内终止另一个正在运行的线程(1)

本文介绍了在Win32多线程编程中,如何安全地结束子线程。讨论了包括阻止用户提前结束程序、使用TerminateThread的潜在风险、尝试使用信号和异常的无效性,以及通过设置标记和使用事件对象的方法。强调了线程安全退出的重要性,以防止数据损坏和程序崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《Win32多线程程序设计》–Jim Beveridge & Robert Wiener

  1. 对于多线程程序,如果用户企图结束程序(主线程)时,子线程尚未完成工作,怎么办?
  2. 结束一个线程,听起来好容易,但是结束程序必须按次序进行,以避免发生 race conditions。让程序依次序进行是非常重要的,特别是在程序要结束之前。结束一个程序就好像拆除一栋建筑物一样,在你以推土机轧平它之前,你必须确定每一个人都安全离开了屋子。结束一个程序也是这样,每一个线程都被迫结束,不管它进行到哪里。
做法一:在任何子线程还没完成其工作之前,不准用户结束程序(可能需要长时间等待)

缺点:对于GUI程序,可能需要很长的时间等待程序退出,那么程序有可能看起来像是“挂”了一样。

做法二:TerminateThread() 放弃一个线程(微软不建议使用)

缺点:
TerminateThread() 强迫其行动目标(一个线程)结束,手段激烈而有力,甚至不允许该线程有任何“挣扎”的机会。
此函数唯一可以预期并依恃的是:线程 handle 将变成激发状态,并且传回dwExitCode 所指定的结束代码。
副作用:
1.如果目标线程持有着一个临界区(critical section),这临界区将不会被释放。
2.如果目标线程正在堆里分配内存,堆锁(heap lock)将不会被释放。
3.如果目标线程在结束时调用了某些kernel32,会造成kernel32的状态不一致。
4.如果目标线程正在更改一个共享DLL的全局状态,这个共享DLL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值