C ++子线程引发异常

时间:2018-07-30 08:14:38

标签: c++ multithreading

假定从main方法启动线程。如果在线程中引发了异常但未在线程中处理异常,会发生什么?主线程会被中断吗?

2 个答案:

答案 0 :(得分:5)

  

如果在线程中引发异常但未在线程中处理该异常怎么办?

std::thread中执行的函数中未捕获异常时,将调用std::terminate,默认情况下将调用std::abort。除非处理SIGABRT信号(通过使用std::signal注册处理程序),否则这将导致整个过程终止。一个最小的例子:

void foo() {
    throw 0;
}

int main() {
    {
        std::thread t(foo);
        std::cout << 1 << std::endl;
    }
    std::cout << 2 << std::endl;
}

1可能会被打印,具体取决于是否在处理终止之前将其清除。 2将不会打印,因为该过程将在达到该过程之前终止。

请注意,虽然只能在引发异常的线程中捕获异常,但是可以这样做,复制(或移动)异常,然后重新抛出主线程,然后可以再次捕获该异常。例如,通过std::async实现此方法。从std:::async抛出将被标准库捕获,并在访问或销毁返回的std::future时再次抛出。


如果您使用std::thread以外的其他线程API,例如平台本身的线程API,请查阅该API的文档。

答案 1 :(得分:0)

子线程独立于主线程运行,并且有多种方法可以从主线程与子线程通信。但是,如果子线程死亡,并且子线程中有任何异常,则不会对主线程产生任何影响,并且子线程中的异常无法在主线程中进行处理。但是,如果子线程基于该报告生成一些报告,其中主线程需要进行某些操作,那么它将影响主线程中的该业务操作。