此代码在循环内每40秒调用一次函数。由于time_t是在我的linux系统中签名的,我对这种情况表示怀疑:
if ((time_left <= 0 || time_left > interval))
只检查(time_left <= 0)
罚款吗?我提到了一些网站,他们还添加了time_left > interval
的支票。需要检查吗?
int print_timed_op()
{
time_t time_now;
time_t time_left;
time_t time_next_interval;
int interval = 40, hit_count =10; //40 second interval, 10 times
time_next_interval = time(0) + interval;
//tight loop
while (1) {
sleep(1);
time_now = time(0);
time_left = time_next_interval - time_now;
/* here time_left > interval check required ? */
if ((time_left <= 0 || time_left > interval)) {
call_my_fuc();
time_next_interval = time(0) + interval;
time_left = interval;
hit_count--;
}
if(hit_count <= 0)
break;
}
return 0;
}
注意:我不想使用Linux计时器系统调用或任何其他方法定期调用该函数。
答案 0 :(得分:2)
检查time_left > interval
是为了处理时钟更改或同步。如果您的间隔为40秒,并且有人出现并更新系统时钟以将其向前移动一小时,那么如果您没有进行检查,则会错过90次更新。
您可以使用clock_gettime()
CLOCK_MONOTONIC
选项以更精确的方式克服此问题。然后时间将永远不会向前或向后跳过,并且您的函数调用将始终均匀分布。