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.
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