首頁  >  文章  >  後端開發  >  如何使用“exception_ptr”在 C 執行緒之間傳播異常?

如何使用“exception_ptr”在 C 執行緒之間傳播異常?

Linda Hamilton
Linda Hamilton原創
2024-10-31 23:15:28512瀏覽

How do you propagate exceptions between threads in C   using `exception_ptr`?

在C 中的執行緒之間傳播異常

當從主執行緒呼叫的函式產生多個執行緒時,就會出現在C 中的執行緒之間傳播異常的任務。用於 CPU 密集型工作的工作執行緒。挑戰在於處理工作執行緒上可能發生的異常並將其傳播回主執行緒以進行正確處理。

傳統方法

一種常見的方法是手動捕獲工作線程上的各種異常,記錄它們的詳細信息,然後在主線程上重新拋出它們。但是,此方法有一個限制,即它僅支援一組固定的異常類型。將來引入的任何新異常類型都需要手動修改程式碼。

C 11 異常處理

C 11 引入了 exception_ptr 類型,提供了更強大的解決方案用於異常傳播。這種類型允許在線程之間傳輸異常。

範例實作

以下範例示範如何使用Exception_ptr傳播異常:

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

static std::exception_ptr eptr;

void worker() {
  try {
    // Simulated CPU-intensive work with a delay
    std::this_thread::sleep_for(std::chrono::seconds(1));
    throw std::runtime_error("Exception in worker thread");
  } catch (...) {
    eptr = std::current_exception();
  }
}

int main() {
  // Create a worker thread
  std::thread workerThread(worker);
  workerThread.join();

  // Check if an exception occurred on the worker thread
  if (eptr) {
    try {
      // Rethrow the exception on the main thread
      std::rethrow_exception(eptr);
    } catch (const std::exception &ex) {
      // Handle the exception on the main thread
      std::cerr << "Worker thread exited with exception: " << ex.what() << "\n";
    }
  }

  return 0;
}</code>

在此範例中,工作執行緒擷取發生的任何異常並將其分配給eptr。在主執行緒上,檢查 eptr,如果存在異常,則重新拋出異常。

多個工作線程的注意事項

如果您有多個工作線程,您需要為每個線程維護單獨的exception_ptr 實例以捕獲任何潛在的異常。

其他注意事項

  • exception_ptr 是一個共享的類似指針的類型,因此,確保至少有一個exception_ptr 指向每個異常以防止它們被釋放至關重要。
  • Microsoft 特定:當使用帶有 /EHa 編譯器標誌的 SEH 異常時,範例程式碼也可能捕獲SEH 異常,例如存取衝突。這可能不適合所有情況。

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

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