在C++中,线程的异常处理与主线程的异常处理略有不同。因为每个线程都有自己的运行栈,所以当线程抛出异常时,该异常不会直接传递给主线程。为了处理线程中的异常,我们需要在线程函数内部捕获异常,并将其存储在一个线程局部存储(Thread Local Storage, TLS)变量中,然后在线程函数结束之前将其传递给主线程。
以下是一个简单的示例,展示了如何在C++线程中捕获异常并将其传递给主线程:
#include <iostream>
#include <thread>
#include <stdexcept>
#include <mutex>
std::mutex mtx;
thread_local std::exception_ptr threadExceptionPtr;
void threadFunction() {
try {
// 在这里执行你的线程代码
throw std::runtime_error("An error occurred in the thread.");
} catch (...) {
threadExceptionPtr = std::current_exception();
}
}
int main() {
std::thread t(threadFunction);
t.join();
if (threadExceptionPtr) {
try {
std::rethrow_exception(threadExceptionPtr);
} catch (const std::exception& e) {
std::lock_guard<std::mutex> lock(mtx);
std::cerr << "Caught exception in main thread: " << e.what() << std::endl;
}
}
return 0;
}
在这个示例中,我们定义了一个名为threadFunction
的线程函数,它使用try-catch
块捕获异常。如果线程抛出异常,我们将异常指针存储在threadExceptionPtr
中。在线程函数结束后,我们通过调用join()
等待线程完成。然后,我们检查threadExceptionPtr
是否包含异常指针。如果包含,我们使用std::rethrow_exception()
重新抛出异常,并在catch
块中捕获它。最后,我们使用互斥锁保护输出,以防止多个线程同时输出异常信息。