Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在一定时间后中断该功能。(C+;+;)_C++_Exception_Exception Handling_Subprocess_Signals - Fatal编程技术网

C++ 在一定时间后中断该功能。(C+;+;)

C++ 在一定时间后中断该功能。(C+;+;),c++,exception,exception-handling,subprocess,signals,C++,Exception,Exception Handling,Subprocess,Signals,我的问题与下面的问题完全一致 然而,上面的问题是围绕Python实现的。我试图在C++中实现同样的事情。代码如下: #include <signal.h> #include <stdio.h> #include <stdbool.h> #include <unistd.h> #include <stdexcept> void handle_alarm( int sig ) { printf("%d",sig); t

我的问题与下面的问题完全一致

然而,上面的问题是围绕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; 
        } 
    }   
}
#包括
#包括
#包括
#包括
#包括
无效句柄_报警(int sig){
printf(“%d”,sig);
抛出std::无效的_参数(“无”);
}
int main(){

对于(inti=0;i解决问题的一种方法是使用
async

然后,您可以使用返回的只等待特定时间的结果

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

这不会真正“中断”函数,它仍将继续,直到完成。但这是一种继续程序的方法



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

插入信号处理程序是不好的。您不应该在信号处理程序中执行非常高级的操作,最终它应该只设置一个标志(最好是原子标志)然后你检查一下。你要找的是“协同程序”……不确定C++是否有,但是在C和Uny3D中,你可以做到。@布兰登“协同程序”似乎有机会。但是,您能否提供任何参考,在本文中讨论它们。wait_for似乎是一个不错的选择,但它不适合我的任务。我有1000次迭代,如果每次都不终止,将导致很高的延迟。