《Win32多线程程序设计》–Jim Beveridge & Robert Wiener
- 对于多线程程序,如果用户企图结束程序(主线程)时,子线程尚未完成工作,怎么办?
- 结束一个线程,听起来好容易,但是结束程序必须按次序进行,以避免发生 race conditions。让程序依次序进行是非常重要的,特别是在程序要结束之前。结束一个程序就好像拆除一栋建筑物一样,在你以推土机轧平它之前,你必须确定每一个人都安全离开了屋子。结束一个程序也是这样,每一个线程都被迫结束,不管它进行到哪里。
做法一:在任何子线程还没完成其工作之前,不准用户结束程序(可能需要长时间等待)
缺点:对于GUI程序,可能需要很长的时间等待程序退出,那么程序有可能看起来像是“挂”了一样。
做法二:TerminateThread() 放弃一个线程(微软不建议使用)
缺点:
TerminateThread() 强迫其行动目标(一个线程)结束,手段激烈而有力,甚至不允许该线程有任何“挣扎”的机会。
此函数唯一可以预期并依恃的是:线程 handle 将变成激发状态,并且传回dwExitCode 所指定的结束代码。
副作用:
1.如果目标线程持有着一个临界区(critical section),这临界区将不会被释放。
2.如果目标线程正在堆里分配内存,堆锁(heap lock)将不会被释放。
3.如果目标线程在结束时调用了某些kernel32,会造成kernel32的状态不一致。
4.如果目标线程正在更改一个共享DLL的全局状态,这个共享DLL

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

被折叠的 条评论
为什么被折叠?



