MST
星途 面试题库

面试题:C++中线程创建与管理之异常处理

在C++多线程编程中,使用`std::thread`创建线程,如果线程函数抛出异常,应该如何处理以确保程序的稳定性和资源的正确释放?请举例说明。
23.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 异常处理方式
    • 在C++多线程编程中,当使用std::thread创建线程且线程函数可能抛出异常时,可以使用try - catch块来捕获异常。
    • 同时,要注意std::thread对象的生命周期管理,避免线程泄漏。如果std::thread对象在析构时其关联的线程仍在执行,会导致程序终止(调用std::terminate)。
  2. 示例代码
#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void threadFunction() {
    try {
        std::lock_guard<std::mutex> lock(mtx);
        std::cout << "Thread started" << std::endl;
        // 模拟可能抛出异常的操作
        throw std::runtime_error("Some error in thread");
        std::cout << "Thread ended" << std::endl;
    } catch (const std::exception& e) {
        std::lock_guard<std::mutex> lock(mtx);
        std::cerr << "Exception caught in thread: " << e.what() << std::endl;
    }
}

int main() {
    std::thread t(threadFunction);
    try {
        t.join();
    } catch (const std::exception& e) {
        std::cerr << "Exception in main: " << e.what() << std::endl;
    }
    return 0;
}

在上述代码中:

  • threadFunction函数内部使用try - catch块捕获线程函数内抛出的异常,并在捕获到异常时输出错误信息。
  • main函数中,通过try - catch块捕获join操作可能抛出的异常(虽然在这个例子中join一般不会抛出异常,但为了全面展示异常处理机制加上),并且确保std::thread对象t在退出main函数前调用了join,避免线程泄漏。