C++子线程抛出异常

C++ Subthreads throw exceptions

本文关键字:抛出异常 线程 C++      更新时间:2023-10-16

假设线程是从main方法启动的。如果在线程中抛出异常但未在线程内处理,会发生什么情况?主线会中断吗?

如果在线程中抛出异常但未在线程内处理,会发生什么?

当在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将不会打印,因为该过程将在到达之前终止。

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


如果您使用std::thread以外的某些线程API,例如您的平台本机的线程,请参阅该API的文档。

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