停止合约算法的最佳方式

Best way to stop contract algorithm?

本文关键字:最佳 方式 算法      更新时间:2023-10-16

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

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

不幸的是,这不是很快,而且该方法的运行速度比最初的慢得多。

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

其他合约/任何时间算法如何处理这个问题?

您是否考虑过使用定时器中断?这样你就不用投票了;相反,它利用系统固有的硬件时钟在50毫秒过去时提醒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 */
    }
}

我会做的是:

有一个监视器线程。监视器线程生成工作线程。监视线程有等待循环,但没有繁忙的等待循环。使用<lt;子线程允许的总时间。

如果子线程的运行时间超过了约定时间,则终止子线程。

algo的下方。需要巧妙地处理被杀线程的清理功能,这样,如果孩子需要被杀,它就不会让你处于不愉快的状态。

如果从进程而不是线程的角度来思考,我们可以使用类似的想法。