1

当我在 Linux 2.6.26 系统(Debian 5.0.5)上设置一个短暂的超时setitimer然后查询设置值(withgetitimer或 another setitimer)时,我得到一个高于我设置的值:

#include <sys/time.h>
#include <iostream>

int main() {
  struct itimerval wanted, got;

  wanted.it_value.tv_sec     = 0;
  wanted.it_value.tv_usec    = 7000;
  wanted.it_interval.tv_sec  = 0;
  wanted.it_interval.tv_usec = 0;

  setitimer(ITIMER_VIRTUAL, &wanted, NULL);
  getitimer(ITIMER_VIRTUAL, &got);

  std::cerr << "we said: " << wanted.it_value.tv_usec << "\n"
            << "linux set: " << got.it_value.tv_usec << std::endl;

  return 0;
}

返回:

we said: 7000
linux set: 12000

这是有问题的,因为我们使用一些计算后报告的剩余时间,而且它们也太大了。

这是一个已知问题吗?(谷歌搜索不起作用。)有没有人有一个好的解决方法?

4

1 回答 1

1

函数的POSIX 文档中setitimer有一个注释

实现可能会限制计时器值的粒度。对于每个间隔定时器,如果请求的定时器值需要比实现支持更精细的粒度,则实际定时器值应向上舍入到下一个支持的值

您系统中的粒度似乎高于 1000 微秒(似乎是 6000 微秒),并且计时器值向上取整。如果您需要这种精度,那么计时器粒度就是问题所在。

于 2011-07-29T13:01:06.617 回答