Envoyer et intercepter des signaux aux pthreads en C
Je sais comment faire pour envoyer des signaux aux processus enfant en C en utilisant les kill(pid_t pid, int sig)
fonction. Qu'en envoyant des signaux de threads? est-il possible?. Si oui, comment intercepter des signaux sur l' "enfant" thread. Par exemple, si le thread principal envoie moi un résilier le signal, comment puis-je dans l'autre thread de l'attraper.
source d'informationauteur gvalero87
Vous devez vous connecter pour publier un commentaire.
Avec des threads POSIX, vous avez les fonctions
pthread_cond_wait
etpthread_cond_signal
.Le signalé thread doit bloquer sur un
pthread_cond_wait
appel jusqu'à ce qu'un autre thread envoie un signal à l'aide d'pthread_cond_signal
avec la même variable de condition.Compte tenu de l'analogie avec les signaux livrés à des processus, c'est un peu différent parce que la signalées thread a déjà suspendu son exécution en attente d'un signal, à la différence d'un processus qui, tout simplement, est interrompu et s'en va.
Les signaux sont envoyés à un processus dans son ensemble. Chaque signal envoyé au processus est reçu par un seul thread (au nom de l'ensemble du programme). Il y a par thread masques de signal influence de savoir si un thread particulier est admissible à gérer un particulier signal.
Donc, vous avez besoin d'un gestionnaire de signal - peut-être dans un seul thread. Notez qu'il existe des limites à ce que vous êtes censé faire dans un thread du gestionnaire de signal. Méfiez-vous de marcher loin des promesses faites par la norme (qui sont minimes).
Cependant, la
pthread_kill()
fonction peut être utilisée pour envoyer des signaux à d'autres threads tant que le thread actuel peut identifier (a accès à l'ID de thread valeurs (pthread_t
) identifier) les threads qui sont toujours en cours d'exécution dans le processus. Vous pouvez décider de transmettre un signal pour les autres threads en utilisant un autre numéro de signal à partir de l'origine pris (donc un thread reçoit le signal externe, mais de nombreux threads recevoir le signal interne). Ou vous pouvez utiliser un autre Pthread de la synchronisation ou de la communication primitive au lieu de signaux.Signaux n'ont pas d'affinité de thread. Ils sont complètement pris en main de manière asynchrone. Lorsque vous spécifiez un gestionnaire de signal avec
signal(2)
ousigaction(2)
c'est un mondial gestionnaire de signal. Lorsqu'un signal est élevé, plus le gestionnaire de signal s'exécute sur le dessus de la pile de ce thread s'exécute à la fois, et vous ne pouvez pas le contrôler.Il semble que vous voulez une autre sorte de interthread de la communication. La façon la plus simple de le faire est avec un
volatile
variable partagée:Si vous avez besoin de plus de contrôle de la simultanéité, de la regarder dans les mutex, les variables de condition, et les sémaphores.
Je ne suis pas sûr que c'est possible car il est une plate-forme et la mise en œuvre de personne à charge et je vous suggère fortement de ne pas utiliser les signaux de communication entre les threads. Parfois, seul un thread spécifique recevront des signaux et parfois tous les threads de recevoir des signaux.
Mieux fil communucation il existe des mécanismes comme les files d'attente, les sémaphores, et de serrures.