首頁 >後端開發 >C++ >C 中如何在執行緒之間傳播異常?

C 中如何在執行緒之間傳播異常?

Linda Hamilton
Linda Hamilton原創
2024-10-31 04:14:02669瀏覽

How Can Exceptions be Propagated Between Threads in C  ?

執行緒之間的異常傳播

在多執行緒應用程式中,處理工作執行緒中發生的異常而不導致整個應用程式崩潰非常重要。本文探討如何將例外從工作線程傳播到主線程,從而允許呼叫者優雅地處理它們。

異常傳播的挑戰

一種簡單的方法是捕獲工作線程中的異常並記錄其類型和訊息。但是,此方法僅限於一組特定的異常類型,並且在新增異常時需要手動修改程式碼。

使用Exception_ptr進行異常傳播

C 11引入了exception_ptr類型,它提供了一種安全靈活的方式來在執行緒之間儲存和傳輸異常。在這種方法中:

  1. 每個工作執行緒捕獲異常並將其儲存在Exception_ptr中。
  2. 主執行緒檢查Exception_ptr以查看是否發生任何異常。
  3. 如果發現異常,主執行緒會重新拋出異常,允許呼叫者處理它。

程式碼範例

<code class="cpp">#include <iostream>
#include <thread>
#include <exception>
#include <stdexcept>

static std::exception_ptr myException;

void f() {
    try {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        throw std::runtime_error("To be passed between threads");
    } catch (...) {
        myException = std::current_exception();  // Store the exception
    }
}

int main() {
    std::thread myThread(f);
    myThread.join();

    if (myException) {
        try {
            std::rethrow_exception(myException);  // Rethrow the exception
        } catch (const std::exception& ex) {
            std::cerr << "Thread exited with exception: " << ex.what() << "\n";
        }
    }

    return 0;
}</code>

多-執行緒注意事項

在多個工作執行緒的場景中,需要使用Exception_ptrs數組來捕獲每個線程的異常。此外,Exception_ptr 是共享指針,因此確保至少有一個Exception_ptr 指向每個異常以防止過早釋放是至關重要的。

以上是C 中如何在執行緒之間傳播異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn