signal and multithreading

Le
Guillaume GOURDIN
Bonjour à tous,

je travaille actuellement une petite applicatino multi-threadée (2
threads). Mon problème est que pour termiber l'exécution, j'intercepte
les SIGINT et SIGTERM. Mon problème est que de temps en temps, mon
application part en dead lock quand je tape Ctrl+C, et je pense que
c'est dû au fait que la fonction 'signal' n'est pas thread safe.

Ma question est donc: quel est le moyen canonique d'intercepter les
Ctrl+C pour terminer proprement l'execution d'une application multi
threadée?

Merci beaucoup pour votre aide.

- Guillaume -
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Grasshoper
Le #17471091
09/10/2008 13:54 - Guillaume GOURDIN :
je travaille actuellement une petite applicatino multi-threadée (2
threads). Mon problème est que pour termiber l'exécution, j'intercepte
les SIGINT et SIGTERM. Mon problème est que de temps en temps, mon
application part en dead lock quand je tape Ctrl+C, et je pense que
c'est dû au fait que la fonction 'signal' n'est pas thread safe.

Ma question est donc: quel est le moyen canonique d'intercepter les
Ctrl+C pour terminer proprement l'execution d'une application multi
threadée?



Une des méthodes (il y en a peut-être d'autre que je ne connais pas) est
de dédier un thread à l'interception des signaux, et de les attendre
gentiment avec sigwaitinfo() (dans une belle boucle while(1)).

Ce qui implique que les signaux doivent être bloqués dans tous les
autres threads.
Guillaume GOURDIN
Le #17471391
>> Ma question est donc: quel est le moyen canonique d'intercepter les
Ctrl+C pour terminer proprement l'execution d'une application multi
threadée?



Une des méthodes (il y en a peut-être d'autre que je ne connais pas) est
de dédier un thread à l'interception des signaux, et de les attendre
gentiment avec sigwaitinfo() (dans une belle boucle while(1)).

Ce qui implique que les signaux doivent être bloqués dans tous les
autres threads.



Merci pour l'information. Quelle est la fonction à appeler pour bloquer
les signaux dans un thread?

Merci encore.
Jean-Marc Bourguet
Le #17471381
Guillaume GOURDIN
Bonjour à tous,

je travaille actuellement une petite applicatino multi-threadée (2
threads). Mon problème est que pour termiber l'exécution, j'intercepte les
SIGINT et SIGTERM. Mon problème est que de temps en temps, mon application
part en dead lock quand je tape Ctrl+C, et je pense que c'est dû au fait
que la fonction 'signal' n'est pas thread safe.

Ma question est donc: quel est le moyen canonique d'intercepter les Ctrl+C
pour terminer proprement l'execution d'une application multi threadée?

Merci beaucoup pour votre aide.



Bloquer les signaux asynchrones dans toutes les threads sauf une qui est
bloquee en attente de ceux-ci. Voir sigwait et pthread_sigmask.

Chercher eventuellement dans les archives de comp.programming.threads
avec ces mots cles les messages de David Butenhof.

A+

--
Jean-Marc FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc Site de
usenet-fr: http://www.usenet-fr.news.eu.org
Grasshoper
Le #17472561
09/10/2008 14:24 - Guillaume GOURDIN :
Ma question est donc: quel est le moyen canonique d'intercepter les
Ctrl+C pour terminer proprement l'execution d'une application multi
threadée?


Une des méthodes (il y en a peut-être d'autre que je ne connais pas) est
de dédier un thread à l'interception des signaux, et de les attendre
gentiment avec sigwaitinfo() (dans une belle boucle while(1)).

Ce qui implique que les signaux doivent être bloqués dans tous les
autres threads.



Merci pour l'information. Quelle est la fonction à appeler pour bloquer
les signaux dans un thread?



pthread_sigmask()

Une bonne référence sur ce sujet : Programmation système en C sous
Linux, Christophe Blaess, chapitre 12.
Guillaume GOURDIN
Le #17473801
>> Ma question est donc: quel est le moyen canonique d'intercepter les Ctrl+C
pour terminer proprement l'execution d'une application multi threadée?



Bloquer les signaux asynchrones dans toutes les threads sauf une qui est
bloquee en attente de ceux-ci. Voir sigwait et pthread_sigmask.



Ok, j'ai fait comme recommandé par vous 2: j'ai un thread qui ne sert
qu'à intercepter les signaux grâce à sigwait. Ma question est la
suivante: l'appel à sigwait étant bloquant, est-il gênant de ne pas
terminer ce thread proprement lorsque le programme se termine naturellement?
Sylvain SF
Le #17477411
Guillaume GOURDIN a écrit :

l'appel à sigwait étant bloquant, est-il gênant de ne pas
terminer ce thread proprement lorsque le programme se termine
naturellement?



la fin "naturelle" ne peut-elle pas "s'auto-signaler" (sigqueue)
afin de sortir de ce thread en attente, et de l'appli. dans la
foulée ?

Sylvain.
Patrick Lamaizière
Le #17480411
Guillaume GOURDIN:

Bonjour à tous,

je travaille actuellement une petite applicatino multi-threadée (2
threads). Mon problème est que pour termiber l'exécution, j'intercepte
les SIGINT et SIGTERM. Mon problème est que de temps en temps, mon
application part en dead lock quand je tape Ctrl+C, et je pense que
c'est dû au fait que la fonction 'signal' n'est pas thread safe.



Et c'est quoi la question sur le langage C ?

Pour ce genre de question fr.comp.os.unix est plus indiqué.
Antoine Leca
Le #17527201
En news:, Patrick Lamaizière va
escriure:
Guillaume GOURDIN:

je travaille actuellement une petite applicatino multi-threadée (2
threads). Mon problème est que pour termiber l'exécution,
j'intercepte les SIGINT et SIGTERM. Mon problème est que de temps en
temps, mon application part en dead lock quand je tape Ctrl+C, et je
pense que c'est dû au fait que la fonction 'signal' n'est pas thread
safe.



Et c'est quoi la question sur le langage C ?



Bin, la question en tant que telle est pertinente (utilise des signaux
officiels, etc.)

Le problème (ce que ne peut pas savoir a priori Guillaume) est que la
solution, elle, est spécifique au système qu'il utilise.


Pour ce genre de question fr.comp.os.unix est plus indiqué.



Yep.


Antoine
Publicité
Poster une réponse
Anonyme