【问题标题】:Best way to stop contract algorithm?停止合约算法的最佳方法?
【发布时间】:2016-05-19 15:57:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c++ algorithm chrono contract


    【解决方案1】:

    您是否考虑过使用定时器中断?这样你就可以避免轮询;相反,它利用系统时钟的本机硬件在 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 */
        }
    }
    

    【讨论】:

    • 感谢您的回答! windows / VC14有类似的东西吗?
    【解决方案2】:

    我会做的是:

    有一个监控线程。 监视器线程产生工作线程。 监控线程有等待循环,但没有忙等待循环。使用

    如果子线程运行时间超过合同时间,则终止子线程。

    算法的缺点。 需要对被杀死的线程进行巧妙的处理清理功能,这样如果孩子需要被杀死,它就不会让你处于不愉快的状态。

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

    【讨论】:

    • 我测试了这种方法,但这会导致新的问题。我的处理速度没有变慢,而是启动速度很慢,即使使用线程池也需要 13.000 - 50.000ns 才能开始在空闲的四核 i5 上运行我的任务。由于我想在 50.000ns 之后终止任务,所以我在终止任务时甚至经常没有完成一次计算。
    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2012-01-20
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多