web-dev-qa-db-fra.com

Tuer le fil dans la bibliothèque Pthread

J'utilise pthread_create(&thread1, &attrs, //... , //...); et besoin si une condition survient besoin de tuer ce fil comment tuer cela?

38
Sajad Bahmani

Commencez par stocker l'identifiant du fil

pthread_create(&thr, ...)

puis appelez plus tard

pthread_cancel(thr)

Cependant, ce n'est pas une pratique de programmation recommandée! Il est préférable d'utiliser un mécanisme de communication inter-thread tel que des sémaphores ou des messages pour indiquer au thread qu'il doit arrêter l'exécution.

Notez que pthread_kill (...) ne met pas réellement fin au thread de réception, mais lui envoie un signal. Cela dépend du signal et des gestionnaires de signal.

54
Antti Huima

Il y a deux approches à ce problème.

  • Utilisez un signal : Le thread installe un gestionnaire de signal à l'aide de sigaction() qui définit un indicateur, et le thread vérifie périodiquement l'indicateur pour voir s'il doit se terminer. Lorsque le thread doit se terminer, émettez le signal avec pthread_kill() et attendez sa fin avec pthread_join(). Cette approche nécessite une pré-synchronisation entre le thread parent et le thread enfant afin de garantir que le thread enfant a déjà installé le gestionnaire de signaux avant de pouvoir gérer le signal de terminaison.
  • Utilisez un point d'annulation : le thread se termine chaque fois qu'une fonction d'annulation est exécutée. Lorsque le thread doit se terminer, exécutez pthread_cancel() et attendez sa fin avec pthread_join(). Cette approche nécessite l'utilisation détaillée de pthread_cleanup_Push() et pthread_cleanup_pop() pour éviter les fuites de ressources. Ces deux derniers appels risquent de perturber la portée lexicale du code (car il peut s'agir de macros générant des jetons { et }) et sont très difficiles à gérer correctement.

(Notez que si vous avez déjà détaché le fil à l'aide de pthread_detach(), vous ne pourrez plus le rejoindre à l'aide de pthread_join().)

Les deux approches peuvent être très délicates, mais l'une ou l'autre pourrait être particulièrement utile dans une situation donnée.

21
alecov

Je suis d'accord avec Antti, la meilleure pratique serait d'implémenter des points de contrôle où le thread vérifie s'il doit se terminer. Ces points de contrôle peuvent être implémentés de différentes manières, par exemple: une variable partagée avec verrou ou un événement que le thread vérifie s'il est défini (le thread peut choisir d'attendre zéro heure).

6
Fredrik Jansson

Examinez la fonction pthread_kill().

3
Wyzard
pthread_exit(0) 

Cela va tuer le fil.

0
Anand Paul