私のマルチスレッド GUI アプリケーションには、次のシグナル処理コードがあります。このコードを改善して、正しくスレッドセーフになるようにしたいのですが、シグナル処理で完全に理解できないことがいくつかあります。
- シグナルはプロセスまたはスレッド レベルで処理されますか (スレッド固有のシグナル ハンドラーを使用できますか) ?
- どのスレッドコンテキストで signal_handler 関数が実行されますか?
- 短時間に多くの SIGTERM シグナルを送信できますか?
- 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);
}
init 関数にシグナル ハンドラを登録します。
// register signal handlers
signal(SIGTERM, signal_handler);
signal(SIGINT, signal_handler);
signal(SIGUSR1, signal_handler);