Piszę program z wątkiem głównym i wątkami roboczymi, i chciałbym, aby obsługa sygnałów była właściwa. Mój problem jest następujący:Wątki master/worker i obsługa sygnałów
rozpoczyna gwint Mistrz i zrobić cały przydział
Mistrz wątek ustawia obsługi sygnału SIGINT
Mistrz wątki uruchomić wątków roboczych. wątki robocze nie wymagają specjalnego czyszczenia, jednak mogą spać podczas wywołania systemowego lub semafora.
Po otrzymaniu SIGINT rozumiem, że otrzymuje go tylko jeden wątek. Więc jeśli wątek śpi w wywołaniu systemowym lub semaforze, nie zostaną one przebudzone i nie będę w stanie wykonać wątków roboczych i wykonać wszystkie niezbędne operacje czyszczenia w głównym wątku.
Czy następujący program obsługi sygnału może rozwiązać mój problem?
void term(int sig)
{
g_do_cleanup = 1;
pthread_kill(worker_1_id, some_other_signal);
...
pthread_kill(worker_2_id, some_other_signal);
}
Czego oczekuję, że po otrzymaniu SIGINT, cały wątek zostanie zasygnalizowane z innego sygnału, wydostać się z ich blokowania połączeń, zobacz flagę g_do_cleanup
i wdzięcznie wyjście.
Każdy komentarz lub link, jak to zrobić poprawnie jest mile widziany.
Edycja: Nie szukam sposobu na przebudzenie wielu wątków oczekujących na konkretny stan, więc nie sądzę, że podejście pthread_cond_signal jest tym, czego szukam. Co chcę jest:
- Znajdź sposób, że wszystkie nici, które są zablokowany na połączenia blokującego zwraca z tych połączeń.
- Lub zabij wszystkie wątki z wyjątkiem głównego.
Tak.Większość ludzi używa implementacji pthread lub Win32/MFC do wykonywania wątków. – Kieveli
Nie, nie sądzę, że jest w porządku, ponieważ nie obudziłaby mnie z blokowania połączenia select lub wywołania sem_wait. Może mógłbym zastąpić moje semafory pthread_condition, ale abstrakcja semaforowa naprawdę pasuje do mojego modelu synchronizacji. – shodanex