Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

signal and multithreading

8 réponses
Avatar
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 -

8 réponses

Avatar
Grasshoper
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.
Avatar
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?

Merci encore.
Avatar
Jean-Marc Bourguet
Guillaume GOURDIN writes:

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
Avatar
Grasshoper
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.
Avatar
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?



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?
Avatar
Sylvain SF
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.
Avatar
Patrick Lamaizière
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é.
Avatar
Antoine Leca
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