c++線程異常處理該如何做

c++
小樊
84
2024-10-16 10:37:06

在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í)輸出異常信息。

0