多线程,如果线程崩溃,应用程序会发生啥

Posted

技术标签:

【中文标题】多线程,如果线程崩溃,应用程序会发生啥【英文标题】:Multithreading, if a thread get crashed what will happen to application多线程,如果线程崩溃,应用程序会发生什么 【发布时间】:2012-08-06 12:46:32 【问题描述】:

我是多线程应用程序的新手。在开始研究之前,我几乎没有任何疑问。 谁能解开这些疑惑?

    如何处理多线程应用程序中的异常? 如果任何1个线程出现异常,会不会整个应用程序都会来 下?还是所有其他线程都会继续?

【问题讨论】:

@Anonymous 你能详细说明一下吗? 【参考方案1】:

如何处理多线程应用程序中的异常?

最好的方法是在线程内部,但有时例如。 (线程池)这很难。处理未处理的异常取决于应用程序的类型:

WPF:使用Application.DispatcherUnhandledException 控制台或服务:使用AppDomain.UnhandledException

ASP.NET、WinForms、...有自己的机制。

但请考虑:特别是在开发以允许默认处理并进入调试器时(添加 if (Debugger.IsAttached) Debugger.Break(); 对定义永久断点非常有帮助

如果任何1个线程出现异常,整个应用程序会宕机吗?

这取决于。在 ASP.NET 中:否(如果启用调试,您将看到黄屏死机,否则会出现 500 服务器错误结果);在其他主机中:取决于(但通常答案是“是”,该进程将终止)。

这方面的一些细节在 .NET 版本之间发生了变化——通常会变得更加严格,因此您需要进行研究。最后:在 .NET 4 中,当然也可能在之前,某些异常(例如***Exception无法被捕获,因为如果它们被抛出,没有可靠的方法来获得一致的进程状态。 p>

【讨论】:

@Matt 做一些 ASP.NET 编码,除非你把一切都做对了,否则你会看到很多。是 ASP.NET 错误显示。 谢谢。我是 VB.NET 编码员,所以我只见过 BSOD(太频繁了!)【参考方案2】:

如果您使用 TPL,则可以使用聚合异常。这个聚合异常是一个异常的集合,你可以通过它们循环查看哪个线程执行失败,更多信息可以在这里找到。 http://msdn.microsoft.com/en-us/library/dd997415.aspx

【讨论】:

以上是关于多线程,如果线程崩溃,应用程序会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

在多线程 C++11 程序中未处理异常时会发生啥?

在多线程 C++11 程序中未处理异常时会发生啥?

多线程和多进程模式有啥区别

在这种情况下主线程会发生啥

调用具有条件变量等待的线程对象的析构函数时会发生啥?

多线程并发会造成程序周期性崩溃吗?