Estoy escribiendo un programa, con un hilo maestro y algunos hilos de trabajo, y me gustaría obtener el manejo de la señal correcta. Mi problema es el siguiente:hilos maestro/trabajador y manejo de señales
inicios de rosca Maestro y hacer toda la asignación
hilo Maestro establece un manejador de señales SIGINT
hilos Master Inicio subprocesos de trabajo. los hilos de trabajo no necesitan una limpieza especial, sin embargo, pueden estar durmiendo en la llamada al sistema o en el semáforo.
Cuando se recibe SIGINT, entiendo que solo lo recibe un hilo. Así que si el hilo está durmiendo en la llamada al sistema o en el semáforo, no se despertarán, y no podré pthread_unirme a mis hilos de trabajo y hacer toda la limpieza necesaria en mi hilo maestro.
¿Puede el siguiente controlador de señal resolver mi problema?
void term(int sig)
{
g_do_cleanup = 1;
pthread_kill(worker_1_id, some_other_signal);
...
pthread_kill(worker_2_id, some_other_signal);
}
Lo que espero es que al recibir SIGINT, todo el hilo se señalizará con otra señal, salir de su llamada de bloqueo, ver la bandera g_do_cleanup
y con gracia salida.
Cualquier comentario o enlace sobre cómo hacer esto correctamente es bienvenido.
Edit: No estoy buscando una manera de activar el hilo múltiple en espera de una condición en particular, por lo que no creo que el enfoque pthread_cond_signal es lo que estoy buscando. Lo que quiero es:
- encontrar un camino que todo hilo que sean bloqueado en una llamada de bloqueo vuelve de estas llamadas.
- O elimine todos los hilos excepto el principal.
Sí.La mayoría de las personas usa pthread o las implementaciones de Win32/MFC para hacer subprocesos – Kieveli
No, no creo que esté bien, porque no me despertaba de una llamada de selección de bloqueo o una llamada sem_wait. Tal vez podría reemplazar mis semáforos por pthread_condition, pero la abstracción de semáforos realmente se ajusta a mi modelo de sincronización. – shodanex