2010-11-26 4 views
1

J'ai un problème avec pthreads en utilisant ANSI C sur Linux.Comment tuer un pthread dans ANSI C

Je veux obtenir des commandes en utilisant un thread, donc il les attend. Mais, dans un certain cas, j'ai besoin de le tuer. Si j'utilise pthread_kill(), il envoie un signal et tue tout le processus. Et, si je suis sur la bonne voie, pthread_cancel nécessite que le thread soit préparé pour cela.

Y a-t-il un nettoyeur ou un moyen plus simple de tuer un fil d'un autre fil?

Merci.

+0

Répétition possible de http://stackoverflow.com/questions/2084830/kill-thread-in-pthread, utilisation de gestionnaires de signaux et gestion de pthread_kill() – vpit3833

+1

Juste une note de côté: vous ne devez pas dire "ANSI C" lorsque vous ne le pensez pas. ANSI C ne concerne pas les threads ou autres moyens d'exécution en parallèle. Au lieu de cela, vous voulez probablement dire un environnement POSIX. –

+0

@ vpit3833 Nous avons pensé à cette option, peut-être devrions-nous la reconsidérer ... Je me demande simplement s'il y a plus de moyens. @Roland Illig: Vous avez raison. – jesusiniesta

Répondre

4

Vous ne dites pas quel type de commande/message votre thread attend, mais si vous pouvez lui envoyer un message "allez-vous vous tuer s'il vous plaît", puis attendez qu'il meure avec pthread_join (...), vous serez beaucoup plus heureux.

Si votre thread attend un descripteur de fichier, vous pouvez utiliser poll() ou select() et l'attendre sur deux descripteurs de fichiers. Ensuite, votre thread principal peut lui envoyer des messages sur le second.

Si votre thread est en attente d'événements GUI, la plupart des kits d'outils permettent d'envoyer vos propres messages. Par exemple PostMessage() dans Win32, ou XSendEvent() dans X11.

+0

C'est un travail d'équipe, et je ne le code pas, mais je pense que ce n'est que pour prendre des commandes de stdin (dans un programme qui doit prendre des commandes à partir d'un fichier et/ou d'autres programmes). Il n'a pas d'interface graphique, juste CLI. Merci pour la contribution. – jesusiniesta

+0

Dans ce cas, vous pouvez fermer() stdin et dire à votre coéquipier que cela signifie qu'il doit nettoyer et quitter. – xscott

+0

En fait, rétrospectivement, je ne pense même pas que ce soit un hack. :-) – xscott