MGNeo Asked:2020-07-10 22:49:51 +0800 CST2020-07-10 22:49:51 +0800 CST 2020-07-10 22:49:51 +0800 CST 线程可以在不使进程崩溃的情况下崩溃吗? 772 进程中的线程是否有可能由于错误(分段错误、被零除、内存损坏、竞争条件等)而崩溃或挂起,但内部有这样一个线程的进程继续工作? 如果是,什么时候可能? c++ 2 个回答 Voted Best Answer MSDN.WhiteKnight 2020-07-13T14:07:20+08:002020-07-13T14:07:20+08:00 在 C++ 中,从标准的角度来看,没有“跌倒或挂起”的概念——枚举的状态会导致未定义的行为。例如,对于除以零,这在第 8.6 节乘法运算符第 4 点中进行了描述: 如果 / 或 % 的第二个操作数为零,则行为未定义。 未定义的行为是指标准不对程序的行为施加限制,实现也不需要文档化。然而,在整数除以零的情况下,大多数实现中的行为是众所周知的:在任何线程上尝试除零时,整个程序都会崩溃。此外,Windows 还知道在这种情况下使用的 SEH 异常代码,这使您可以对这种情况做出反应并继续执行程序,包括在同一个线程中。此处描述了如何执行此操作:除以 0 时捕获异常 这同样适用于除竞态条件之外的大多数其他错误情况,因为它通常不会导致崩溃,而只会导致错误的数据读/写。也就是说,“线程可以在不使进程崩溃的情况下失败吗?” 答案是“理论上是的,这取决于你所说的跌倒是什么意思”。但在实践中,值得指望的是这样的错误会导致整个过程的异常终止。 Aziz Umarov 2020-07-11T01:23:56+08:002020-07-11T01:23:56+08:00 这种情况在多线程应用程序中很典型。 每个线程都是一个单独的类,就像一个进程一样。如果,比如说,数据传输流已经下降,为什么程序会崩溃? 浏览器刷新页面数据传输错误,除以零,页面未加载浏览器继续工作。 您正在尝试由另一个线程读取和处理文件,线程已死亡失败。这应该如何影响?
在 C++ 中,从标准的角度来看,没有“跌倒或挂起”的概念——枚举的状态会导致未定义的行为。例如,对于除以零,这在第 8.6 节乘法运算符第 4 点中进行了描述:
未定义的行为是指标准不对程序的行为施加限制,实现也不需要文档化。然而,在整数除以零的情况下,大多数实现中的行为是众所周知的:在任何线程上尝试除零时,整个程序都会崩溃。此外,Windows 还知道在这种情况下使用的 SEH 异常代码,这使您可以对这种情况做出反应并继续执行程序,包括在同一个线程中。此处描述了如何执行此操作:除以 0 时捕获异常
这同样适用于除竞态条件之外的大多数其他错误情况,因为它通常不会导致崩溃,而只会导致错误的数据读/写。也就是说,“线程可以在不使进程崩溃的情况下失败吗?” 答案是“理论上是的,这取决于你所说的跌倒是什么意思”。但在实践中,值得指望的是这样的错误会导致整个过程的异常终止。
这种情况在多线程应用程序中很典型。
每个线程都是一个单独的类,就像一个进程一样。如果,比如说,数据传输流已经下降,为什么程序会崩溃?
浏览器刷新页面数据传输错误,除以零,页面未加载浏览器继续工作。
您正在尝试由另一个线程读取和处理文件,线程已死亡失败。这应该如何影响?