Maison > développement back-end > C++ > le corps du texte

Comment puis-je propager efficacement les exceptions entre les threads dans une application C multithread ?

Susan Sarandon
Libérer: 2024-11-01 10:08:33
original
125 Les gens l'ont consulté

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

Propagation des exceptions entre les threads

Dans les applications multithread, la gestion des exceptions des threads de travail peut être difficile. Il est essentiel d'éviter que les exceptions non gérées ne fassent planter l'ensemble de l'application et de fournir au thread principal un moyen de les gérer correctement.

Techniques de propagation des exceptions

L'approche suggérée dans la question implique de détecter les exceptions sur les threads de travail, d'enregistrer leur type et leur message, et de les renvoyer sur le thread principal à l'aide d'une instruction switch. Bien qu'efficace, il présente des limites dans la prise en charge d'un ensemble limité de types d'exceptions.

Une solution plus robuste consiste à exploiter le type exception_ptr introduit dans C 11. Exception_ptr permet de transporter des exceptions entre les threads.

Exemple avec Exception_ptr (C 11)

Le code suivant montre comment utiliser exception_ptr pour propager des exceptions entre plusieurs threads de travail et le thread principal :

<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>
Copier après la connexion

Dans Dans cet exemple, un exception_ptr distinct est alloué à chaque thread de travail, permettant à plusieurs exceptions d'être levées et propagées au thread principal. Cette approche fournit une solution plus dynamique et flexible pour la gestion des exceptions dans les applications multithread.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!