Hilos y Señales
Las señales son compartidas por todos los hilos de un proceso. La configuración de señales hecha por la hebra principal es heredada por todas las hebras creadas desde la hebra principal. Las señales son enviadas a un único hilo en el proceso. No sirve que una hebra espere por una señal, pues
puede ser recibida por otra. Este comportamiento depende de la implementación de la biblioteca de hebras: podría ocurrir que sólo la hebra principal reciba las señales en una implementación y en otra que la reciba cualquier hebra. Si la señal está relacionada a una falla de
hardware, la señal es usualmente enviada al hilo que causó la
situación,
pero en otros casos la señal es enviada a un hilo arbitrario.
Un hilo puede bloquear (o habilitar) la señale usando pthread_sigmask(...) de manera que las señales no lleguen a este hilo. como en:
pthread_sigmask(SIG_BLOCK, &mask, NULL);
Un hilo también puede esperar por la ocurrencia de una o más señales
llamando:
#include <signal.h>
int sigwait(const sigset_t * restrict set, int * restrict signop).
set especifica el conjunto de señales por las cuales se espera. Cuando
se retorna signop apunta a un entero indicando la señal que despertó la
hebra.
Usted puede revisar el ejemplo LeakyBucket
donde se usan las funciones señaladas arriba en conjunto con hebras.
Cuando usamos signal() o sigaction() su efecto es global, es decir aplica a todo el proceso (todas sus hebras).
Para prender más sobre señales en programación multihebras, revise aquí, o más general aquí.