首頁 >後端開發 >C++ >如何在多執行緒 C 應用程式中的執行緒之間有效傳播異常?

如何在多執行緒 C 應用程式中的執行緒之間有效傳播異常?

Susan Sarandon
Susan Sarandon原創
2024-11-01 10:08:33215瀏覽

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

在執行緒之間傳播異常

在多執行緒應用程式中,處理工作執行緒中的異常可能具有挑戰性。避免未處理的異常導致整個應用程式崩潰,並為主執行緒提供一種優雅地處理它們的方法至關重要。

異常傳播技術

中建議的方法該問題涉及捕獲工作線程上的異常,記錄它們的類型和訊息,並使用switch 語句將它們重新拋出到主線程。雖然有效,但它在支援有限的異常類型方面存在局限性。

更強大的解決方案是利用 C 11 中引入的Exception_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>

在這個範例中,為每個工作執行緒分配一個單獨的Exception_ptr,允許拋出多個例外並傳播到主執行緒線。這種方法為多執行緒應用程式中的異常處理提供了更動態和靈活的解決方案。

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

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