Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/11/2012, à 20:35

Fabien.r

Id d'un thread

Bonjour à tous,

J'ai une question, je ne sais pas si c'est possible mais j'aimerai savoir si on peut connaître l'identifiant d'un thread qui envoie un signal?

En gros j'ai ceci :

void handle(int sig){ 
	pthread_t id = pthread_self();
	printf("Dans le handle : %ld\n", id);
	if(pthread_equal(tid[0],id))
		printf("Le meme\n");
	else
		printf("Pas le meme\n");  
 }

tid est tableau de thread, qui ne contient qu'un seul thread pour le moment, ce test échoue dans la fonction handle qui sert à traiter SIGALRM dans mon programme.

Pourtant quand je fais le ce même test depuis mon thread il marche correctement.

Merci d'avance.

Hors ligne

#2 Le 24/11/2012, à 23:09

NicoZic56

Re : Id d'un thread

Bonjour,

Tu ne peux pas connaître le thread qui a envoyé le signal.
Dans ton exemple de handler, pthread_self() va te donner l'identifiant du thread qui reçoit le signal.

Ensuite, dans un programme multi-threadé, il est toujours très difficile de savoir quel thread va recevoir un signal.
De mémoire (désolé je manque de temps pour faire une réponde plus précise), mais la règle de livraison du signal suit la règle suivante :
- envoi au thread qui ferait une attente explicite sur un signal (sigwaitinfo)
- si il n'y en n'a pas, alors à un thread bloqué sur une attente (ex: attente sur ipc)
- s'il n'y en n'a pas, à n'importe quel thread.
Bref, c'est le bo***l.

Un conseil de design : NE JAMAIS UTILISER LES SIGNAUX !
Sauf dans de très rares occasions (exemple débloquer un thread en attente du clavier), c'est toujours une très mauvaise idée : cela fait des applications instables, difficiles à maintenir. et il n'y a aucune garantie de ne pas perdre des signaux.
C'est en plus, une très mauvaise idée de détourner SIGALARM, surtout s'il y a des commandes sleep dans ton code... les résultats peuvent être curieux dans ce cas, et je pense que c'est ton cas : man 2 sleep est très clair à ce sujet.

Pour info, cela fait environs 6 ans que je fais de la programmation multi-tâche sous linux, et (comme tous mes collègues) je n'utilise plus jamais les signaux, au point que j'ai un peu oublié comment ça marche... J'ai passé un peu de temps sur google à chercher de la doc, mais je n'ai rien trouvé rapidement...


============
"Il n'y a que deux sortes de langages de programmation: ceux dont les gens disent toujours du mal et ceux que personne n'utilise."
Bjarne Stroustrup

Hors ligne