Maison  >  Article  >  développement back-end  >  Comment propager les exceptions entre les threads en C en utilisant `exception_ptr` ?

Comment propager les exceptions entre les threads en C en utilisant `exception_ptr` ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 23:15:28512parcourir

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 se produit 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 Exception Handling

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 :

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

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 << "Worker thread exited with exception: " << ex.what() << "\n";
    }
  }

  return 0;
}</code>

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.

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