最近我一直在尝试使用挂钟作为参考创建一个等待 25 毫秒的等待函数。我环顾四周,发现“gettimeofday”,但我一直遇到问题。我的代码(简化):
while(1)
{
timeval start, end;
double t_us;
bool release = false;
while (release == false)
{
gettimeofday(&start, NULL);
DoStuff();
{
gettimeofday(&end, NULL);
t_us = ( (end.tv_sec - start.tv_sec) * 1000*1000) + (end.tv_usec - start.tv_usec);
if (t_us >= 25000) //25 ms
{
release = true;
}
}
}
}
此代码在线程 (Posix) 中运行,并且就其本身而言,工作正常。DoStuff() 每 25 毫秒调用一次。但是,如果可以(如您所料),它确实会吃掉所有的 CPU,所以显然这不是一个好主意。
当我尝试通过添加 Sleep(1) 来限制它时;在 if 语句之后的等待循环中,整个事情减慢了大约 50%(也就是说,它每 37 毫秒左右调用一次 DoStuff。这对我来说毫无意义 - 假设 DoStuff 和任何其他线程在 (25 - 1) ms DoStuff 的调用率不应受到影响(允许 1ms 误差范围)
我还尝试了 Sleep(0)、usleep(1000) 和 usleep(0),但行为是相同的。
每当另一个更高优先级的线程需要 CPU 时间(没有睡眠)时,都会发生相同的行为。就好像当线程重新启动运行时时钟停止计数一样。
我知道 gettimeofday 容易受到 NTP 更新等的影响...所以我尝试使用 clock_gettime 但在我的系统上链接 -ltr 会导致问题,所以我认为这不是一个选项。
有谁知道我做错了什么?