一段时间后打破功能。 (C ++)

时间:2017-12-10 00:17:00

标签: c++ exception exception-handling subprocess signals

我的问题与以下问题完全一致。

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'。我也曾尝试使用自定义异常类,但错误仍然存​​在。

我无法弄清楚这个具体实现有什么问题,或者是否存在其他更好的方法?任何帮助将非常感激。

1 个答案:

答案 0 :(得分:1)

解决问题的一种方法是将std::asyncasync launch policy一起使用。

然后,您可以使用返回的wait_forstd::future仅在特定时间内等待结果。

如果你没有在时间范围内得到结果,那么保存未来(它不能是destructed,直到它有结果!)但是忽略它及其可能的结果。

这不会真正“破坏”这个功能,它会一直持续到完成。但无论如何,这是继续你的计划的一种方式。

另一种可能的解决方案是使用threads并在其中不断检查超时,或者为某些(atomic)标志确定是否应该继续。