Maison > Article > développement back-end > Comment propager les exceptions entre les threads en C en utilisant `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
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!