2017-02-06 15 views
0

Bonjour à tous, J'utilise le multi-threading en C++ 11. Je veux faire un mécanisme dans lequel il gardera la trace de tous les threads en cours et terminés. Si un thread est terminé, il créera automatiquement le thread terminé. Quelqu'un a une idée sur la façon de mettre en œuvre cela en C++ 11? Merci beaucoup d'avance.Comment garder la trace à la fin du thread en C++ 11

+1

Je suppose que vous allez * rejoindre * le fil terminé? Une solution simple est juste un drapeau booléen atomique que le thread définit la dernière chose qu'il fait avant de quitter. Le thread principal interroge ce drapeau et, s'il est défini, rejoint le thread. –

+0

Pour ajouter un commentaire @Someprogrammerdude, notez que certaines * bibliothèques de threads * (* pthreads *) fournissent une * jointure * non bloquante * supplémentaire qui supprime le problème de * scrutation * de l'état * thread * avant * de le rejoindre *. Il pourrait être moins efficace, mais il devrait aboutir à une conception plus propre. –

+0

Merci pour votre replay @Someprogrammerdude. Je n'ai jamais utilisé de drapeau atomique auparavant. où dois-je ajouter ce drapeau booléen dans mon programme? –

Répondre

0

modèle commun d'écrire du code, qui survit à des exceptions est de l'envelopper dans une boucle et essayer bloc, comme ceci:

for(;;) { 
    try { 
     // Your code here 
    } catch (const std::exception& e) { 
     // Log exception 
    } catch (...) { 
     // Log unknown exception 
    } 
} 

Il est courant dans les serveurs: si au service demande de l'utilisateur échoue, connectez-il, abandonnez la connexion actuelle et essayez de servir le suivant. Bien sûr, il y a une chance que quelque chose de vraiment mauvais se soit produit et toutes les nouvelles tentatives échoueront. Vous devez donc faire attention à ne pas surcharger votre PC avec une boucle infinie qui essaie encore et encore.

Vous pouvez placer cette boucle dans votre thread afin qu'elle ne tombe pas en panne si quelque chose se produit ou, au lieu d'utiliser des threads directement, vous pouvez utiliser std::future et mettre le code future.get() dans cette boucle.