Non-bloquant pthread_join
Je suis le codage de l'arrêt d'un serveur multithread.Si tout se passe comme il se doit tous les threads de sortir de leur propre, mais il ya une petite chance que le fil se coince.Dans ce cas, il serait pratique de disposer d'un non-bloquant joindre afin que je puisse faire.
Est-il un moyen de faire un non-bloquant pthread_join?
Une sorte de chronométrés rejoindre serait bien aussi.
quelque chose comme ceci:
foreach fil nb_pthread_join(); si toujours en cours d'exécution pthread_cancel();
Je pense, plus de cas d'un non-bloking rejoindre serait utile.
Comme il semble, il n'y a pas de telle fonction, donc j'ai déjà codé une solution de contournement, mais il n'est pas aussi simple que je le voudrais.
- non-blocage de la jointure de thread? Je pensais rejoindre était tout au sujet de blocage :s
Vous devez vous connecter pour publier un commentaire.
Comme d'autres l'ont souligné, il n'est pas un non-bloquant pthread_join disponibles dans le standard pthread bibliothèques.
Toutefois, compte tenu de votre problème (en essayant de garantir que l'ensemble de vos fils ont quitté le programme d'arrêt) une telle fonction n'est pas nécessaire. Vous pouvez simplement faire ceci:
Il n'y a rien de mal avec l'appel de pthread_cancel sur l'ensemble de vos threads (terminé ou non) afin de l'appelant que pour l'ensemble de votre fils ne va pas bloquer et la garantie du fil de sortie (propre ou non).
Qui devrait être considéré comme un "simple" solution de contournement.
pthread_cancel
sur chaque thread ne garantit pas que tous les threads ont cessé d'exister. Ils pourraient ne pas avoir atteint toute annulation point, ou même si elles ont, le thread principal peut obtenir prévue le premier et le retour demain
, tuer le processus, avant que les autres threads peuvent terminer le nettoyage de...Si vous exécutez votre application sur Linux, vous pourriez être intéressés de savoir que:
Être prudent, car le suffixe indique, "np" signifie "non portable". Ils ne sont pas la norme POSIX, les extensions gnu, si utiles qu'.
lien vers la page de man
Le " pthread_join mécanisme est pratique à utiliser que si il arrive à faire exactement ce que vous voulez. Il ne fait rien, tu ne pouvais pas faire vous-même, et où il n'est pas exactement ce que vous voulez, code exactement ce que vous voulez.
Il n'y a pas de véritable raison pour laquelle vous devriez effectivement se préoccuper de savoir si un thread a résilié ou non. Ce qui vous préoccupe est de savoir si le travail que le fil était en train de faire est terminée. Dire que le thread de faire quelque chose pour indiquer qu'il fonctionne. La façon de le faire dépend de ce qui est idéal pour votre problème spécifique, qui dépend fortement de ce que les fils sont en train de faire.
Commencez par changer votre façon de penser. Ce n'est pas un fil qui se coince, c'est ce que le fil était en train de faire qui se coince.
pthread_join
... pas de problème maintenant. Je vous remercie pour votre temps.Si vous êtes en développement pour QNX, vous pouvez utiliser pthread_timedjoin() fonction.
Sinon, vous pouvez créer un thread qui va effectuer pthread_join() et alerte les parents du fil, par la signalisation d'un sémaphore par exemple, que l'enfant thread se termine. Ce thread séparé pouvez revenir ce qui est devient de pthread_join() pour que le parent fil de déterminer non seulement lorsque l'enfant se termine, mais aussi la valeur qu'elle renvoie.
La réponse dépend vraiment pourquoi vous voulez le faire. Si vous voulez juste pour nettoyer dead threads, par exemple, il est probablement plus facile juste pour avoir un "dead threads nettoyeur" thread que des boucles et des jointures.
Je ne suis pas sûr exactement ce que vous voulez dire, mais je suis en supposant que ce que vous avez besoin c'est d'attendre et d'en informer le mécanisme.
En bref, voici comment cela fonctionne: Vous attendez pour une condition à satisfaire avec un délai d'attente. Votre attente sera plus si:
Vous pouvez avoir cela dans une boucle et ajouter un peu plus d'intelligence à votre logique. La meilleure ressource que j'ai trouvé pour ce lié à Pthreads est ce tutoriel:
POSIX Threads la Programmation (https://computing.llnl.gov/tutorials/pthreads/).
Je suis aussi très surpris de voir qu'il n'y a pas d'API pour chronométré rejoindre dans Pthreads.
Il n'est pas chronométré
pthread_join
, mais si vous êtes en attente pour les autres thread bloqué sur les conditions, vous pouvez utiliser chronométrépthread_cond_timed_wait
au lieu depthread_cond_wait
De pousser un octet dans un tuyau ouvert de non-blocage de signal pour les autres fil lorsque c'est fait, puis d'utiliser un non-blocage de la lecture pour vérifier l'état de la pipe.