シグナルはメインスレッドに割り込みますか、それとも OS スレッドから呼び出されますか? つまり、シグナル ハンドラを実装するときにスレッド セーフについて心配する必要はありますか? たとえばon_sigint
、別のスレッドで呼び出された場合、次のコードはランダムに失敗します。彼らは?しますか?
#include <csignal>
#include <windows.h>
HANDLE hSigint;
void on_sigint(int sig)
{
if (hSigint != NULL) SetEvent(hSigint);
else hSigint = INVALID_HANDLE_VALUE;
}
int wmain(int argc, wchar_t** argv)
{
hSigint = NULL;
signal(SIGINT, on_sigint);
BuildSomething();
if (hSigint == NULL)
{
hSigint = CreateEvent(NULL, TRUE, FALSE, NULL);
SetSomethingInMotion();
WaitForSingleObject(hSigint, INFINITE);
}
TearSomethingDown();
return 0;
}
Windows の例ですが、Linux の回答も歓迎します。