C で「Exception_ptr」を使用してスレッド間で例外を伝播するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-10-31 23:15:28
オリジナル
511 人が閲覧しました

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

C のスレッド間で例外を伝播する

C のスレッド間で例外を伝播するタスクは、メイン スレッドから呼び出された関数が複数のスレッドを生成するときに発生します。 CPU を集中的に使用する作業のためのワーカー スレッド。課題は、ワーカー スレッドで発生する可能性のある例外を処理し、それらをメイン スレッドに伝播して適切に処理することにあります。

従来のアプローチ

一般的なアプローチの 1 つは次のとおりです。ワーカー スレッドでさまざまな例外を手動でキャッチし、その詳細を記録し、メイン スレッドで再スローします。ただし、このメソッドには、例外タイプの固定セットのみがサポートされるという制限があります。将来導入される新しい例外タイプでは、コードを手動で変更する必要があります。

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 がチェックされ、例外が存在する場合は再スローされます。

複数のワーカー スレッドに関する注意

複数のワーカー スレッドがある場合潜在的な例外をキャプチャするには、スレッドごとに別個の例外_ptr インスタンスを維持する必要があります。

追加の考慮事項

  • Exception_ptr は共有ポインタのような型であり、したがって、例外が解放されないように、少なくとも 1 つの例外_ptr が各例外を指していることを確認することが重要です。
  • Microsoft 固有: /EHa コンパイラ フラグを指定して SEH 例外を使用する場合、サンプル コードでもキャプチャされる可能性があります。アクセス違反などの SEH 例外。これは、すべての場合において望ましいとは限りません。

以上がC で「Exception_ptr」を使用してスレッド間で例外を伝播するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!