Maison >développement back-end >C++ >Comment propager les exceptions entre les threads en C ?

Comment propager les exceptions entre les threads en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-29 07:46:02807parcourir

How do I propagate exceptions between threads in C  ?

Franchir les limites des threads avec des exceptions

Dans les applications multithread, il est impératif de gérer les exceptions avec élégance pour éviter les plantages et la corruption des données. Un scénario courant est celui où un thread principal génère des threads de travail pour effectuer des tâches intensives et attend leurs résultats. Dans de tels cas, les exceptions se produisant dans les threads de travail doivent être propagées au thread principal pour une gestion appropriée.

Propagation des exceptions avec exception_ptr

C 11 a introduit le type exception_ptr , qui permet le transport des exceptions entre les threads. Prenons l'exemple suivant :

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

static std::exception_ptr teptr = nullptr;

void f()
{
    try
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        throw std::runtime_error("To be passed between threads");
    }
    catch(...)
    {
        teptr = std::current_exception();
    }
}</code>

La fonction f() intercepte toute exception et la capture dans teptr à l'aide de std::current_exception().

Récupération des exceptions sur le thread principal

Le thread principal récupère l'exception du thread de travail :

<code class="cpp">std::thread mythread(f);
mythread.join();

if (teptr) {
    try{
        std::rethrow_exception(teptr);
    }
    catch(const std::exception &amp;ex)
    {
        std::cerr << "Thread exited with exception: " << ex.what() << "\n";
    }
}</code>

Si une exception a été capturée (teptr n'est pas nul), std::rethrow_exception() renvoie le exception sur le thread principal, permettant à l'appelant de la gérer.

Gestion de plusieurs threads de travail

Pour les scénarios avec plusieurs threads de travail, vous pouvez avoir un exception_ptr pour chaque thread pour capturer les exceptions. De plus, notez que exception_ptr est un pointeur partagé ; ainsi, au moins un pointeur doit toujours pointer vers une exception pour éviter une suppression prématurée.

Attention aux exceptions spécifiques à Microsoft

Si vous utilisez des exceptions de gestion structurée des exceptions (SEH) , l'exemple de code transportera également les exceptions SEH, ce qui peut ne pas être souhaitable.

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!

Déclaration:
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