C++ 子线程抛出异常

标签 c++ multithreading

<分区>

假设一个线程是从 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/

相关文章:

c# - 在 WPF/C# 中按需挂起/重启线程

multithreading - 在多线程世界中使用带有shared_ptr向量的std::sort的危险

c++ - 从 .txt 文件中读取 UNICODE 字符并将它们输出到控制台

linux - 如何确保信号处理程序永远不会屈服于同一进程组中的线程?

c++ - 重载 <<,返回 ostream 会出错。 C++

C++ win32 api双缓冲示例帮助请

delphi - 线程同步问题的困惑

multithreading - __ATOMIC_RELAXED 是什么意思?

c++ - 如何跟踪光位的变化?

java - 如何在 Java 中加载和使用 C DLL 中的结构和函数?