J'utilise pthread_create(&thread1, &attrs, //... , //...);
et besoin si une condition survient besoin de tuer ce fil comment tuer cela?
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.
Il y a deux approches à ce problème.
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.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.
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).
Examinez la fonction pthread_kill()
.
pthread_exit(0)
Cela va tuer le fil.