funkcja obsługi sygnału w środowisku wielowątkowym
W mojej wielowątkowej aplikacji GUI mam następujący kod obsługi sygnału. Chcę poprawić ten kod, aby był poprawny i bezpieczny dla wątków, ale są pewne rzeczy, których nie rozumiem w pełni w obsłudze sygnałów:
czy sygnał jest obsługiwany na poziomie procesu lub wątku (czy mogę mieć specyficzne dla wątku procedury obsługi sygnałów)?w którym kontekście wątku jest wykonywana funkcja signal_handler?czy można wysłać wiele sygnałów SIGTERM w krótkim czasie?czy sensowne jest użycie muteksu, aby zapobiec równoległemu wykonaniu obiektu signal_handler?void signal_handler(int sig)
{
switch (sig)
{
case SIGTERM:
::wxLogMessage(wxT("SIGTERM signal received ..."));
break;
case SIGINT:
::wxLogMessage(wxT("SIGINT signal received ..."));
break;
case SIGUSR1:
::wxLogMessage(wxT("SIGUSR1 signal received ..."));
break;
default:
::wxLogMessage(wxT("Unknown signal received ..."));
}
// send wxCloseEvent to main application window
::wxGetApp().GetTopWindow()->Close(true);
}
Rejestruję procedury obsługi sygnałów w mojej funkcji inicjującej:
// register signal handlers
signal(SIGTERM, signal_handler);
signal(SIGINT, signal_handler);
signal(SIGUSR1, signal_handler);