当一个线程遇到异常时是不是可以冻结所有线程

Posted

技术标签:

【中文标题】当一个线程遇到异常时是不是可以冻结所有线程【英文标题】:Is it possible to freeze all threads when one thread encounters an exception当一个线程遇到异常时是否可以冻结所有线程 【发布时间】:2012-04-05 02:46:01 【问题描述】:

我能够打印在运行时捕获异常的线程的堆栈跟踪。我还需要打印在同一进程中运行的其他线程的踪迹。我有兴趣找到一种在一个线程中捕获异常后立即冻结所有线程的好方法。

现在,我所能做的就是查询每个活动线程,然后对其进行 SuspendThread()。但是,这将导致每个线程在捕获初始异常后执行更长的时间。有没有办法立即让每个线程挂起?

谢谢。

【问题讨论】:

用崩溃报告终止进程?您发送到另一个线程的任何类型的信号都需要时间。我想真正的问题是出于您的目的,什么是瞬时的,您如何快速获得信号? 我不认为“立即”一般来说是可能的,即使对于操作系统......例如,在多核/多处理器机器上,核心#2如何知道在何时停止其线程核心#1 的线程崩溃了?核心#1 必须向核心#2 发送“可疑线程”消息,此时核心#2 的线程已经执行了更多指令。 根据您的应用程序的架构方式,您可能能够使用光纤而不是线程。 (当然,你不希望在发布版本中这样做,但调试时可能没问题。) 线程默认是不同步的。谈论“立即”暂停其他线程是没有意义的,因为它们在不同的时间线上运行。只有在同步事件中才有“同一时间”、“之前”和“之后”的概念。 +1 为 Jeremy - 即使有操作系统支持也无法完成,原因正是所描述的 - 处理器间驱动程序必须中断运行其他线程的核心,而这不会发生'立即”。 【参考方案1】:

您是否尝试使用 PostMessage() 从捕获异常的工作线程到 GUI 线程?

建议的简要步骤: 1) GUI 线程产生少量工作线程 2) 工作线程 PostMessage() 一旦捕获异常 3) GUI 线程接收消息 4)GUI线程指示剩余的工作线程挂起

注意:定义你自己的消息

通过这种方式,您仍然会在暂停工作线程之前看到一些延迟。

另一种方法是在工作线程之间使用像事件句柄这样的同步对象。

【讨论】:

以上是关于当一个线程遇到异常时是不是可以冻结所有线程的主要内容,如果未能解决你的问题,请参考以下文章

当异步方法中的一个发生异常时终止所有线程

MFC 对话框冻结

在线程内更新 pyqtgraph BarGraphItem

并发编程——协程

c#多线程应用程序中的界面冻结

当另一个线程正在工作时,活动在启动时冻结