Le thread qui gère le signal?
J'ai 2 fils(thread1 et thread2). Et j'ai signal disposition pour SIGINT
. Chaque fois que SIGINT
se produit thread 2 doit traiter le signal. Pour que j'ai écrit ci-dessous le programme de
void sig_hand(int no) //signal handler
{
printf("handler executing...\n");
getchar();
}
void* thread1(void *arg1) //thread1
{
while(1) {
printf("thread1 active\n");
sleep(1);
}
}
void * thread2(void * arg2) //thread2
{
signal(2, sig_hand);
while(1) {
printf("thread2 active\n");
sleep(3);
}
}
int main()
{
pthread_t t1;
pthread_t t1;
pthread_create(&t1, NULL, thread1, NULL);
pthread_create(&t2, NULL, thread2, NULL);
while(1);
}
J'ai compilé et et exécuter le programme. pour chaque 1 seconde "thread1 active" est en cours d'impression et pour toutes les 3 secondes "thread2 active" est en cours d'impression.
Maintenant, j'ai généré un SIGINT
. Mais son impression "thread1 active" et "thread2 active" des messages comme ci-dessus. De nouveau, j'ai généré un SIGINT
, maintenant, pour toutes les 3 secondes seulement "thread2 active" message est en cours d'impression. De nouveau, j'ai généré un SIGINT
, maintenant, tous les threads sont bloqués.
Donc j'ai compris, pour la première fois thread principal de l'exécution de gestionnaire de signal. Pour la deuxième fois thread1 l'exécution de gestionnaire et enfin thread2 l'exécution de gestionnaire de signal.
Comment je peux écrire le code comme à chaque fois que le signal se produit, seulement thread2 ont à exécuter mon gestionnaire de signal?
printf
n'est pas un async-fort appel de la bibliothèque, le sens qu'il ne doit PAS être appelée par un gestionnaire de signal... si elle l'est, le comportement est indéterminé (mauvaises choses peuvent se produire).getchar
n'est pas asynchrone de sécurité, pour cette question.- traitement du Signal avec plusieurs threads sous Linux
Vous devez vous connecter pour publier un commentaire.
Si vous envoyez un signal à un processus, thread dans le processus de traiter ce signal est indéterminé.
Selon
pthread(7)
:Si vous voulez un thread dédié dans votre processus pour gérer certains signaux, voici un exemple de
pthread_sigmask(3)
vous montre comment le faire:sigprocmask
oupthread_sigmask
signaux (processus de large) mais alorssigwait()
et manipuler dans un thread de votre choix.sleep()
au lieu desigwait()
?sleep()
au lieu desigwait()
?Lire attentivement signal(7) & pthread(7) & pthread_kill(3) & sigprocmask(2) & pthread_sigmask(3) -que vous pourriez utiliser (pour bloquer
SIGINT
non désirée de threads). À lire aussi, un pthread tutoriel.Éviter d'utiliser des signaux de communiquer ou de synchronisation entre les threads. Considérons par exemple les mutex (pthread_mutex_lock etc...) et les variables de condition (pthread_cond_wait etc...).
Si l'un des threads exécute une boucle d'événement (par exemple autour de poll(2)...) envisager d'utiliser signalfd(2).