C および C++ 標準は、シグナルの概念をサポートしています。ただし、C11 標準では、関数 signal() をマルチスレッド環境で呼び出すことはできないか、動作が未定義であると規定されています。しかし、シグナルメカニズムはマルチスレッド環境向けのものだと思います。
C11 標準 7.14.1.1.7 からの引用
「マルチスレッド プログラムでこの関数を使用すると、未定義の動作が発生します。実装は、信号関数を呼び出すライブラリ関数がないかのように動作します。」
これについての説明はありますか?
次のコードは自明です。
#include <thread>
#include <csignal>
using namespace std;
void SignalHandler(int)
{
// Which thread context here?
}
void f()
{
//
// Running in another thread context.
//
raise(SIGINT); // Is this call safe?
}
int main()
{
//
// Register the signal handler in main thread context.
//
signal(SIGINT, SignalHandler);
thread(f).join();
}