gpt4 book ai didi

c++ - 在 C++11 中,如何在捕获到信号时立即离开函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:45 26 4
gpt4 key购买 nike

在 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();
...
}

让一个线程等待值被改变然后抛出一个异常被另一个线程捕获似乎也不是一个有效的解决方案。

我怎样才能以安全、便携和优雅的方式做到这一点?

最佳答案

您不能从信号处理程序中以可移植的方式抛出异常。

并非所有操作系统实际上都具有堆栈展开所需的适当堆栈框架。您能做的最好的事情就是设置一个标志,然后在您的应用程序中对此进行测试。

为了防止你用测试弄乱你的代码。
您可以将您的应用程序构建到 Reactor 中,然后将实际工作注册到 react 器中。在 react 器执行新工作之前,它会测试是否已设置信号标志。

 Reactor   workList;

workList.add(&callee1);
workList.add(&callee2);

workList.run();

然后在Reactor里面;

 while(notSignalled() && !list.empty());
{
list.head().run();
}

关于c++ - 在 C++11 中,如何在捕获到信号时立即离开函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11053647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com