C++11 プログラムには、特定の UNIX シグナルを受信するたびにできるだけ早く停止する (そして呼び出し元に戻る) 必要がある関数がいくつかあります。一見すると、シグナルが受信され、呼び出し元関数でのみインターセプトされたときにスローされる例外は、明らかな解決策のように見えます。
void sighandler(int sig) {
throw new myexc();
}
void caller(void) {
try {
callee1();
callee2();
} catch (myexc e) {
...
}
}
しかし、安全でポータブルなシグナル処理はかなり制限されています。なぜなら、volatile sig_atomic_t の値を変更することが、シグナル ハンドラーで行うべき唯一の正しいことのように思われるからです。しかし、sig_atomic_t が変更されたかどうかをチェックするテストでコードを散らかしたくありません。
void sighandler(int sig) {
vol = 1;
}
void callee1(void) {
do_stuff();
if (vol == 1) return;
do_other_stuff();
if (vol == 1) return;
do_something_again();
...
}
値が変更されるのを待っているスレッドを持ってから、他のスレッドによってキャッチされる例外をスローすることも、有効な解決策ではないようです。
どうすれば安全でポータブルでエレガントな方法でこれを行うことができますか?