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

Susan Sarandon
リリース: 2024-11-01 10:08:33
オリジナル
125 人が閲覧しました

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 サイトの他の関連記事を参照してください。

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