J'utilise pthread_create(&thread1, &attrs, //... , //...);
et le besoin, si une certaine condition s'est produite besoin de tuer ce fil comment tuer ce ?
Réponses
Trop de publicités?D'abord stocker l'id de thread
pthread_create(&thr, ...)
puis, plus tard, appel
pthread_cancel(thr)
Cependant, ce n'est pas une programmation recommandée! Il est préférable d'utiliser une communication inter-thread mécanisme comme des sémaphores ou les messages à communiquer sur le fil qu'il doit arrêter l'exécution.
Notez que pthread_kill(...) n'a pas réellement mettre fin à la réception de thread, mais délivre un signal à elle, et elle dépend du signal et les gestionnaires de signaux ce qui se passe.
Il y a deux approches à ce problème.
- L'utilisation d'un signal: Le fil installe un gestionnaire de signal à l'aide de
sigaction()
qui définit un indicateur, et le fil vérifie périodiquement le drapeau pour voir si elle doit se terminer. Lorsque le thread doit se terminer, émettre le signal à l'aide d'pthread_kill()
et d'attendre sa fin avecpthread_join()
. Cette approche nécessite une synchronisation entre le thread parent et l'enfant thread, afin de garantir que l'enfant thread a déjà installé le gestionnaire de signal avant il est en mesure de traiter le signal de terminaison; - L'utilisation d'une annulation point: Le thread se termine à chaque fois qu'une annulation de la fonction est exécutée. Lorsque le thread doit être terminée, exécutez
pthread_cancel()
et d'attendre sa fin avecpthread_join()
. Cette approche nécessite la description détaillée de l'utilisation depthread_cleanup_push()
etpthread_cleanup_pop()
pour éviter la fuite de ressources. Ces deux derniers appels peut mess avec le domaine lexical du code (puisqu'ils peuvent être macros rendement{
et}
jetons) et sont très difficiles à maintenir correctement.
(Notez que si vous avez déjà détaché le thread à l'aide de pthread_detach()
, vous ne pouvez pas joindre de nouveau à l'aide de pthread_join()
.)
Les deux approches peuvent être très délicat, mais qui pourrait être particulièrement utile dans une situation donnée.
Je suis d'accord avec Antti, une meilleure pratique serait de mettre en œuvre certaines de point de contrôle(s) où le fil vérifie si elle devrait se terminer. Ces points de contrôle peuvent être mises en œuvre dans un certain nombre de façons, par exemple: une variable partagée avec serrure ou d'un événement que le fil vérifie si elle est définie (le thread pouvez opter pour attendre l'heure zéro).