我正在使用一个应用程序,其中要求是每100ms后执行一个函数。 以下是我的代码
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()只被调用一次然后在checkOCIDs()函数必须在连续等待100ms后执行。 目前,应用程序正在进行一个块,因为checkOCIDs()函数需要超过100毫秒的时间才能完成,在此之前触发Timer Out。 我不希望while(1)与sleep()/ usleep()一起使用,因为它极大地耗尽了我的CPU。 请提出替代方案以达到我的要求。
答案 0 :(得分:0)
目前尚不清楚“检查”功能是否应在正在进行且定时器到期时执行。也许您可以引入变量来指示计时器已过期,并且您的函数应在完成后再次执行,伪代码:
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时,check函数将不会被执行),但这取决于你的要求详情。