miércoles, junio 20, 2007

Señales e hilos (threads): Notas de programación en Unix

Tradicionalmente la semántica asociada a las señales en Unix, hacen que se envíen a los procesos.Sin embargo, este mecanismo cambia cuando se empieza a usar hilos de ejecución (threads). Llegado a este punto hay que distinguir entre señales síncronas - que pueden producirse debido al flujo de instrucciones del hilo y las señales asíncronas - que se producen por causas externas a la ejecución del flujo de instrucciones del hilo - . Dentro de las primeras tenemos SIGILL, SIGFPE o SIGSEGV - se producen cuando se detecta una instrucción ilegal, un error de coma flotante o un acceso a memoria ilegal -, mientras que en el segundo grupo tenemos SIGINT, SIGPIPE o SIGALRM - que se produce por una interrupción vía teclado, intentar escribir a una pipe sin lectores o porque ha saltado una alarma definida con alarm().

Las señales sincronas se mandan siempre al hilo que las ha causado, mientras que las señales asíncronas puede enviarse a cualquiera de los hilos de ejecución, no estando definido a cual de ellos le llegará la señal. Por tanto, esto es un problema que debe de tenerse en cuenta cuando estamos trabajando con una aplicación multihilo.

La mejor estrategia en este caso, es ignorar en todos los hilos las señales, excepto uno, y de esta manera este será el encargado de recibir todas las señales asíncronas que se le manden al proceso. Las máscaras de señales son específicas de cada hilo de ejecución. De esta manera, puede implementarse ese modelo de gestión. Una nota a tener en cuenta es que la máscara de señal de cada hilo es heredada del hilo padre.

El enmascaramiento de las señales es algo a tener en cuenta. En principio, debe hacerse con pthread_sigmask, no con sigaction, ya que este segundo caso cambia el de todo el proceso.

Referencias:
Technical Q&A QA1184
A Primer on Signals in the Solaris OS, Part 1
The Linux Signals Handling Model
Thread-Specific Data and Signal Handling in Multi-Threaded Applications
Requirements of the POSIX Signal Model por Ulrich Drepper
Programming POSIX Threads

Technorati Tags:

1 comentario:

Anónimo dijo...

Me encantan estos blogs que no sirve para nada pero que estan llenos de estúpida publicidad.
Por si tu hilo en ejecución no lo ha notado estoy siendo irónico. Dédicate a otra cosa tío.