在C++中,線程的異常處理與主線程的異常處理略有不同。因?yàn)槊總€(gè)線程都有自己的運(yùn)行棧,所以當(dāng)線程拋出異常時(shí),該異常不會(huì)直接傳遞給主線程。為了處理線程中的異常,我們需要在線程函數(shù)內(nèi)部捕獲異常,并將其存儲(chǔ)在一個(gè)線程局部存儲(chǔ)(Thread Local Storage, TLS)變量中,然后在線程函數(shù)結(jié)束之前將其傳遞給主線程。
以下是一個(gè)簡(jiǎn)單的示例,展示了如何在C++線程中捕獲異常并將其傳遞給主線程:
#include <iostream>
#include <thread>
#include <stdexcept>
#include <mutex>
std::mutex mtx;
thread_local std::exception_ptr threadExceptionPtr;
void threadFunction() {
try {
// 在這里執(zhí)行你的線程代碼
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;
}
在這個(gè)示例中,我們定義了一個(gè)名為threadFunction
的線程函數(shù),它使用try-catch
塊捕獲異常。如果線程拋出異常,我們將異常指針存儲(chǔ)在threadExceptionPtr
中。在線程函數(shù)結(jié)束后,我們通過(guò)調(diào)用join()
等待線程完成。然后,我們檢查threadExceptionPtr
是否包含異常指針。如果包含,我們使用std::rethrow_exception()
重新拋出異常,并在catch
塊中捕獲它。最后,我們使用互斥鎖保護(hù)輸出,以防止多個(gè)線程同時(shí)輸出異常信息。