停止合同算法的最佳方法?

时间:2016-05-19 15:57:48

标签: c++ algorithm chrono contract

我正在使用c ++并且想要创建一个方法,该方法在给定的时间跨度(例如50微秒)之后终止,就像合同算法一样。

该方法正在使用循环,所以我的想法是使用std::chrono::high_resolution_clock::now() 测量经过时间的方法。

不幸的是,这不是很快,并且该方法的运行方式比初始方法慢。

获得相同结果的最佳/更好的方法是什么?

其他合同/随时算法如何处理此问题?

2 个答案:

答案 0 :(得分:1)

你考虑过使用定时器中断吗?这样你就可以避免不得不进行民意调查;它反过来利用系统时钟本机的硬件来在50 ms过去时提醒CPU。在不知道循环的确切结构的情况下,它可能看起来像这样:

#include <sys/time.h>

bool flag;
void handler(int signum){
    flag = true;
}


int main (){
    struct sigaction s_action;
    struct itimerval timer;

    memset (&s_action, 0, sizeof (s_action));
    s_action.sa_handler = &handler;
    sigaction (SIGVTALRM, &s_action, NULL);


    timer.it_value.tv_sec = 0;
    timer.it_value.tv_usec = 50000;         // 50 ms until next signal
    timer.it_interval.tv_sec = 0;
    timer.it_interval.tv_usec = 50000;      // 50 ms between signals

    setitemer(ITIMER_VIRTUAL, &timer, NULL);

    flag = false;
    while(true){
        if(flag)
            break;
        /* do stuff */
    }
}

答案 1 :(得分:0)

我要做的是:

有监听线程。 Monitor线程产生工作线程。 监视器线程具有等待循环,但不是繁忙的等待循环。使用&lt;&lt;&lt;&lt;&lt;&lt;子线程允许的总时间。

如果孩子的跑步时间超过了合约时间,请杀死子线程。

算法的下行。 需要巧妙处理被杀死线程的清理功能,以便在需要杀死孩子时不会让你处于不快乐状态。

如果考虑流程而不是线程,我们可以使用类似的想法。