首頁 > 後端開發 > C++ > 主體

如何處理跨執行緒的C++異常?

WBOY
發布: 2024-06-06 10:44:58
原創
755 人瀏覽過

在多執行緒 C++ 中,例外處理透過 std::promise 和 std::future 機制實作:在拋出例外的執行緒中使用 promise 物件記錄例外。在接收異常的執行緒中使用 future 物件檢查異常。實戰案例顯示如何使用 promise 和 future 在不同執行緒中捕捉和處理異常。

如何處理跨執行緒的C++異常?

如何處理跨執行緒的C++ 例外

前言

在多執行緒程式設計中,異常可能會在任何執行緒中拋出。處理跨線程的異常需要額外的考慮,因為對於異常是如何以及在何處拋出的,沒有明確的控制。

異常傳遞機制

C++ 標準函式庫提供了一個傳遞例外的機制,稱為std::promisestd::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::promisestd::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::promisestd: :future,我們可以安全地處理跨執行緒的例外狀況。這使我們能夠在異常發生後繼續執行,並在以後處理它。

以上是如何處理跨執行緒的C++異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!