<分区>
假设一个线程是从 main 方法启动的。如果在线程中抛出异常,但线程内部没有处理,会发生什么情况?会不会中断主线程?
<分区>
假设一个线程是从 main 方法启动的。如果在线程中抛出异常,但线程内部没有处理,会发生什么情况?会不会中断主线程?
最佳答案
What happens if an exception is thrown in the thread but not handled within the thread?
当在 std::thread
中执行的函数中未捕获异常时,将调用 std::terminate
,默认调用 std::中止
。这将导致整个进程终止,除非处理了 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 的文档。
关于C++ 子线程抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51589650/