- ¿Cuál es la mejor manera de controlar a qué hilo se envía una señal?
Como indicó @ zoli2k, nombrar explícitamente un solo hilo para manejar todas las señales que desea manejar (o un conjunto de hilos, cada uno con responsabilidades de señal específicas), es una buena técnica.
- ¿Cuál es la mejor manera de decirle a otro hilo (que en realidad podría estar ocupado) que la señal ha llegado? [...]
- ¿Cómo puedo manejar de manera segura la transmisión de información de que se ha producido una señal a otros hilos? ¿Es necesario que esto suceda en el manejador de señales?
No diré "mejor", pero esta es mi recomendación:
Bloquea todas las señales deseadas main
para que todos los hilos hereden esa máscara de señal. Luego, modele el subproceso de recepción de señales especiales como un bucle de eventos impulsado por señales, enviando las señales recién llegadas como alguna otra comunicación dentro del subproceso .
La forma más sencilla de hacer esto es hacer que el hilo acepte señales en un bucle usando sigwaitinfo
osigtimedwait
. Luego, el hilo convierte las señales de alguna manera, tal vez transmitiendo un pthread_cond_t
, despertando otros hilos con más E / S, colocando un comando en una cola segura para hilos específica de la aplicación, lo que sea.
Alternativamente, el hilo especial podría permitir que las señales se envíen a un manejador de señales, desenmascarando para su entrega solo cuando esté listo para manejar señales. ( sigwait
Sin embargo, la entrega de señales a través de manejadores tiende a ser más propensa a errores que la aceptación de señales a través de la familia). En este caso, el manejador de señales del receptor realiza una acción simple y segura para señales asíncronas: establecer sig_atomic_t
banderas, llamar sigaddset(&signals_i_have_seen_recently, latest_sig)
, write
() un byte a una de no bloqueo auto-tubo , etc. a continuación, de nuevo en su bucle principal enmascarado, el hilo se comunica la recepción de la señal a otros hilos como anteriormente.
( ACTUALIZADO @caf señala con razón que los sigwait
enfoques son superiores).