在 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();
...
}
让一个线程等待值被更改然后抛出一个异常被另一个线程捕获似乎也不是一个有效的解决方案。
我怎样才能以安全、便携和优雅的方式做到这一点?