在多執行緒 C++ 中,例外處理透過 std::promise 和 std::future 機制實作:在拋出例外的執行緒中使用 promise 物件記錄例外。在接收異常的執行緒中使用 future 物件檢查異常。實戰案例顯示如何使用 promise 和 future 在不同執行緒中捕捉和處理異常。
在多執行緒程式設計中,異常可能會在任何執行緒中拋出。處理跨線程的異常需要額外的考慮,因為對於異常是如何以及在何處拋出的,沒有明確的控制。
C++ 標準函式庫提供了一個傳遞例外的機制,稱為std::promise
和std::future
。我們可以使用它們來安全地在線程之間傳遞異常。
std::promise
負責產生例外,而 std::future
負責接收例外。兩個物件必須在同一個執行緒中建立:
// 在主线程创建 std::promise<void> promise; std::future<void> future = promise.get_future();
當例外在其他執行緒中拋出時,我們可以使用promise
物件將其傳遞:
// 在 worker 线程 try { // ... 代码可能会抛出异常 } catch (const std::exception& e) { promise.set_exception(std::make_exception_ptr(e)); }
然後,可以在主執行緒中使用future
物件來檢查例外:
// 在主线程 try { future.get(); } catch (const std::exception& e) { // 处理异常 }
以下程式碼展示如何使用std::promise
和std::future
來處理跨執行緒異常:
#include <iostream> #include <future> #include <thread> // 打印函数以展示在不同线程中抛出的异常 void printFunction() { try { throw std::runtime_error("这是一个运行时错误!"); } catch (const std::exception& e) { std::cerr << "Worker 线程捕获异常:" << e.what() << '\n'; } } int main() { std::promise<void> promise; std::future<void> future = promise.get_future(); // 在新线程中运行打印函数 std::thread worker(printFunction); // 让主线程等待 worker 线程 try { future.get(); } catch (const std::exception& e) { std::cerr << "主线程捕获异常:" << e.what() << '\n'; } worker.join(); return 0; }
透過使用std::promise
和std: :future
,我們可以安全地處理跨執行緒的例外狀況。這使我們能夠在異常發生後繼續執行,並在以後處理它。
以上是如何處理跨執行緒的C++異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!