「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++ で「Exception_ptr」を使用してスレッド間で例外を伝播するにはどうすればよいでしょうか?

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

2024 年 11 月 6 日に公開
ブラウズ:258

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

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

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

従来のアプローチ

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

C 11 例外処理

C 11 では、Exception_ptr タイプが導入され、より堅牢なソリューションが提供されます。例外の伝播用。このタイプでは、スレッド間で例外を伝達できます。

実装例

次の例は、Exception_ptr:

#include 
#include 
#include 
#include 

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 

この例では、ワーカー スレッドは発生した例外をキャッチし、それを eptr に割り当てます。メインスレッドでは、eptr がチェックされ、例外が存在する場合は再スローされます。

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

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

追加の考慮事項

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

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3