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í.