ホームページ  >  記事  >  バックエンド開発  >  マルチスレッド C アプリケーションのスレッド間で例外を効果的に伝播するにはどうすればよいですか?

マルチスレッド C アプリケーションのスレッド間で例外を効果的に伝播するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-01 10:08:33126ブラウズ

How can I effectively propagate exceptions between threads in a multi-threaded C   application?

スレッド間での例外の伝播

マルチスレッド アプリケーションでは、ワーカー スレッドからの例外を処理するのが困難な場合があります。未処理の例外によってアプリケーション全体がクラッシュすることを避け、メインスレッドがそれらの例外を適切に処理する方法を提供することが重要です。

例外伝播のテクニック

で提案されているアプローチ問題は、ワーカー スレッドで例外をキャッチし、そのタイプとメッセージを記録し、switch ステートメントを使用してメイン スレッドで例外を再スローすることです。効果的ではありますが、限られた例外タイプのサポートに制限があります。

より堅牢な解決策は、C 11 で導入された例外_ptr タイプを利用することです。Exception_ptr を使用すると、スレッド間で例外を転送できます。

Exception_ptr を使用した例 (C 11)

次のコードは、Exception_ptr を使用して複数のワーカー スレッドとメイン スレッド間で例外を伝播する方法を示しています。

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

std::exception_ptr* exceptions[MAX_THREADS]; // Array to store exceptions from worker threads

void f(int id)
{
    try
    {
        // Simulated work
        std::this_thread::sleep_for(std::chrono::seconds(1));
        throw std::runtime_error("Exception in thread " + std::to_string(id));
    }
    catch (...)
    {
        exceptions[id] = std::current_exception();
    }
}

int main()
{
    std::thread threads[MAX_THREADS];

    // Start worker threads
    for (int i = 0; i < MAX_THREADS; i++)
    {
        threads[i] = std::thread(f, i);
    }

    // Wait for threads to finish
    for (int i = 0; i < MAX_THREADS; i++)
    {
        threads[i].join();
    }

    // Check for and propagate exceptions
    for (int i = 0; i < MAX_THREADS; i++)
    {
        if (exceptions[i])
        {
            try
            {
                std::rethrow_exception(*exceptions[i]);
            }
            catch (const std::exception& ex)
            {
                std::cerr << "Thread " << i << " exited with exception: " << ex.what() << "\n";
            }
        }
    }

    return 0;
}</code>

この例では、ワーカー スレッドごとに別個の例外_ptr が割り当てられ、複数の例外がスローされてメイン スレッドに伝播されることが可能になります。このアプローチは、マルチスレッド アプリケーションでの例外処理のための、より動的で柔軟なソリューションを提供します。

以上がマルチスレッド C アプリケーションのスレッド間で例外を効果的に伝播するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。