"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment propager les exceptions entre les threads en C++ à l'aide de `exception_ptr` ?

Comment propager les exceptions entre les threads en C++ à l'aide de `exception_ptr` ?

Publié le 2024-11-06
Parcourir:856

How do you propagate exceptions between threads in C   using `exception_ptr`?

Propagation des exceptions entre les threads en C

La tâche de propagation des exceptions entre les threads en C survient lorsqu'une fonction appelée à partir d'un thread principal génère plusieurs threads de travail pour les travaux gourmands en CPU. Le défi réside dans la gestion des exceptions qui peuvent survenir sur les threads de travail et dans leur propagation au thread principal pour une gestion appropriée.

Approche conventionnelle

Une approche courante consiste à interceptez manuellement diverses exceptions sur les threads de travail, enregistrez leurs détails et renvoyez-les sur le thread principal. Cependant, cette méthode présente une limitation dans la mesure où elle ne prend en charge qu'un ensemble fixe de types d'exceptions. Tout nouveau type d'exception introduit à l'avenir nécessiterait une modification manuelle du code.

C 11 Gestion des exceptions

C 11 introduit le type exception_ptr, offrant une solution plus robuste pour la propagation des exceptions. Ce type permet le transport des exceptions entre les threads.

Exemple d'implémentation

L'exemple suivant montre comment propager des exceptions à l'aide d'exception_ptr :

#include 
#include 
#include 
#include 

static std::exception_ptr eptr;

void worker() {
  try {
    // Simulated CPU-intensive work with a delay
    std::this_thread::sleep_for(std::chrono::seconds(1));
    throw std::runtime_error("Exception in worker thread");
  } catch (...) {
    eptr = std::current_exception();
  }
}

int main() {
  // Create a worker thread
  std::thread workerThread(worker);
  workerThread.join();

  // Check if an exception occurred on the worker thread
  if (eptr) {
    try {
      // Rethrow the exception on the main thread
      std::rethrow_exception(eptr);
    } catch (const std::exception &ex) {
      // Handle the exception on the main thread
      std::cerr 

Dans cet exemple, le thread de travail intercepte toute exception qui se produit et l'assigne à eptr. Sur le thread principal, l'eptr est vérifié et, si une exception est présente, il est renvoyé.

Remarque concernant plusieurs threads de travail

Si vous avez plusieurs threads de travail , vous devrez conserver des instances exception_ptr distinctes pour chaque thread afin de capturer toutes les exceptions potentielles.

Considérations supplémentaires

  • exception_ptr est un type de type pointeur partagé, il est donc crucial de s'assurer qu'au moins un exception_ptr pointe vers chaque exception pour empêcher leur publication.
  • Spécifique à Microsoft : lors de l'utilisation d'exceptions SEH avec l'indicateur du compilateur /EHa, l'exemple de code peut également capturer Exceptions SEH telles que les violations d'accès. Cela n'est peut-être pas souhaitable dans tous les cas.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3