MST

星途 面试题库

面试题:C++实现自定义线程错误处理框架防止进程退出

请设计并实现一个C++框架,用于捕获和处理线程中的崩溃错误,避免进程退出。该框架需具备通用性,能够处理不同类型的线程函数,同时要考虑性能、资源管理以及与现有C++多线程库(如std::thread)的兼容性。描述框架的整体架构、关键类和函数的设计思路,并提供核心代码示例。
40.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

框架整体架构

  1. 异常捕获层:在每个线程的入口处设置异常捕获机制,捕获线程执行过程中抛出的所有异常。
  2. 错误处理层:定义错误处理策略,将捕获到的异常转化为错误信息,并进行相应处理,避免进程退出。
  3. 通用接口层:提供通用的接口,使得不同类型的线程函数都能使用该框架。

关键类和函数设计思路

  1. ThreadWrapper类
    • 功能:包装用户定义的线程函数,在其执行前后添加异常捕获逻辑。
    • 成员变量:存储用户线程函数及其参数。
    • 成员函数:构造函数用于初始化线程函数和参数,run函数用于执行线程函数并捕获异常。
  2. ErrorHandler类
    • 功能:定义错误处理的具体策略,如记录错误日志、进行错误恢复等。
    • 成员函数:handleError函数接收异常信息并进行处理。
  3. createThread函数
    • 功能:作为框架的通用接口,创建并启动线程,使用ThreadWrapper包装用户线程函数。

核心代码示例

#include <iostream>
#include <thread>
#include <functional>
#include <exception>
#include <memory>
#include <sstream>

// 错误处理类
class ErrorHandler {
public:
    virtual void handleError(const std::string& errorMessage) {
        std::cerr << "Error: " << errorMessage << std::endl;
    }
};

// 线程包装类
class ThreadWrapper {
public:
    template<typename Func, typename... Args>
    ThreadWrapper(Func&& func, Args&&... args)
        : func(std::bind(std::forward<Func>(func), std::forward<Args>(args)...)) {}

    void run(std::shared_ptr<ErrorHandler> errorHandler) {
        try {
            func();
        } catch (const std::exception& e) {
            std::ostringstream oss;
            oss << "Exception caught: " << e.what();
            errorHandler->handleError(oss.str());
        } catch (...) {
            errorHandler->handleError("Unknown exception caught");
        }
    }

private:
    std::function<void()> func;
};

// 创建线程的通用接口
std::thread createThread(std::shared_ptr<ErrorHandler> errorHandler,
                         std::function<void()> func) {
    ThreadWrapper wrapper(func);
    return std::thread([&wrapper, errorHandler]() { wrapper.run(errorHandler); });
}

// 示例线程函数
void threadFunction() {
    throw std::runtime_error("Simulated runtime error");
}

int main() {
    auto errorHandler = std::make_shared<ErrorHandler>();
    std::thread t = createThread(errorHandler, []() { threadFunction(); });
    t.join();
    return 0;
}

说明

  1. ErrorHandler类:定义了错误处理的虚函数handleError,用户可继承该类并实现自定义的错误处理逻辑。
  2. ThreadWrapper类:通过模板构造函数接受不同类型的线程函数及其参数,并在run函数中捕获异常。
  3. createThread函数:作为框架的入口,创建线程并启动,将错误处理逻辑传递给ThreadWrapper
  4. 示例代码:在main函数中,创建了一个会抛出异常的线程函数,并通过框架启动线程,展示了框架的使用方式。