【问题标题】:Break the function after certain time. (C++)一定时间后中断功能。 (C++)
【发布时间】: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


【解决方案1】:

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

然后您可以使用返回的std::future 中的wait_for 只等待特定时间得到结果。

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

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


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

【讨论】:

  • wait_for 似乎是一个不错的选择,但它不适合我的任务。我有 1000 次迭代,如果每个迭代都没有终止,则会导致高延迟。
猜你喜欢
  • 2019-03-25
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多