2011-07-28 173 views
1

当我设置一个短暂停时以setitimer然后查询设定值(用getitimer或其他setitimer)在Linux 2.6.26系统(Debian的5.0.5),我得到一个价值高于我设置:setitimer在Linux四舍五入?

#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 

这是有问题的,因为我们使用报告为一些计算后剩余的时间,他们的方式过大,过。

这是一个已知的问题? (谷歌搜索没有奏效。)有没有人有一个很好的解决方法?

回答

1

POSIX documentation of the setitimer function有一张纸条

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

系统中的粒度似乎比1000微秒高(似乎是6000 usec),计时器值被取整。如果您需要这种精度,则定时器粒度是问题。