繁体   English   中英

在C / C ++中每100毫秒重新启动计时器

[英]Have a timer restart every 100ms in C / C++

我正在使用一个要求每100毫秒执行一次功能的应用程序。 下面是我的代码

checkOCIDs()
{
// Do something that might take more than 100ms of time
}
void TimeOut_CallBack(int w)
{
    struct itimerval tout_val;
    int ret = 0;

    signal(SIGALRM,TimeOut_CallBack);

    /* Configure the timer to expire after 100000 ... */
    tout_val.it_value.tv_sec = 0;
    tout_val.it_value.tv_usec = 100000; /* 100000  timer */

    /* ... and every 100 msec after that. */
    tout_val.it_interval.tv_sec = 0 ;
    tout_val.it_interval.tv_usec = 100000;

    checkOCIDs();

    setitimer(ITIMER_REAL, &tout_val,0);

    return ;

}

函数TimeOut_CallBack()仅被调用一次,然后必须在连续等待100ms之后在checkOCIDs()上执行该函数。 当前,由于checkOCIDs()函数需要花费超过100ms的时间来完成并且在触发Timer Out之前,该应用正在等待一个块。 我不希望将while(1)与sleep()/ usleep()一起使用,因为它会极大地消耗我的CPU。 请提出一种替代方案以满足我的要求。

尚不清楚在执行过程中计时器是否到期时是否应执行“检查”功能。 也许可以引入变量来指示计时器已到期,并且应该在函数完成后再次执行您的函数,伪代码:

static volatile bool check_in_progress = false;
static volatile bool timer_expired = false;

void TimeOut_CallBack(int w)
{
    // ...
    if (check_in_progress) {
        timer_expired = true;
        return;
    }

    // spawn/resume check function thread
    // ...
}

void checkThreadProc()
{
    check_in_progress = true;
    do {
        timer_expired = false;
        checkOCIDs();
    } while(timer_expired);
    check_in_progress = false;

    // end thread or wait for a signal to resume
}

请注意,可能需要额外的同步来避免竞争条件(例如,当一个线程存在do-while循环并且仍然设置了check_in_progress而其他设置了timer_expired时,将不执行检查功能),但这取决于您的要求详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM