【发布时间】:2017-12-10 00:16:59
【问题描述】:
我的问题与以下问题完全一致。
break the function after certain time
但是,上述问题围绕 Python 实现展开。我正在尝试在 C++ 中实现相同的功能。代码如下:
#include <signal.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdexcept>
void handle_alarm( int sig ) {
printf("%d",sig);
throw std::invalid_argument("none");
}
int main() {
for (int i=0; i<10; i++){
signal( SIGALRM, handle_alarm );
printf("Doing normal work %d \n",i);
alarm(120);
try {
for (;;){} // It will be replaced by a function which can take very long time to evaluate.
}
catch(std::invalid_argument& e ) {
continue;
}
}
}
问题陈述
:随着循环的每次迭代,将调用一个可能需要很长时间评估的函数 XYZ(在上面的代码中被无限 for 循环替换)。我的目标是终止函数的执行,如果它需要超过 2 分钟,然后继续下一次迭代。
但是,这给了我错误terminate called after throwing an instance of 'std::invalid_argument'。我也曾尝试使用自定义异常类,但错误仍然存在。
我无法弄清楚这个具体实现有什么问题,或者是否存在另一种更好的方法?任何帮助将不胜感激。
【问题讨论】:
-
加入信号处理程序是不好的。您不应该在信号处理程序中做非常高级的事情,最终它应该只设置一个标志(最好是原子标志)然后检查。
-
您正在寻找的是“协程”。不确定 C++ 是否有它们,但在 C# 和 Unity3D 中,您可以做到。
-
@Brandon "Coroutines" 似乎有机会。但是,您能否提供任何参考,在这种情况下讨论它们。
标签: c++ exception exception-handling subprocess signals