当我用setitimer设置一个很短的超时,然后在Linux2.6.26系统(Debian5.0.5)上查询这个设置值(用getitimer或其他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这是有问题的,因为我们使用一些计算后报告的剩余时间,而且它们也太大了。
这是一个已知的问题吗?(谷歌搜索不起作用。)有没有人有好的变通办法?
发布于 2011-07-29 21:01:07
在POSIX documentation of the setitimer function中有一条注释
实现可能会对计时器值的粒度施加限制。对于每个间隔计时器,如果请求的计时器值需要比实现支持的粒度更细的粒度,则实际计时器值应向上舍入到下一个支持的值
您系统中的粒度似乎高于1000微秒(似乎是6000微秒),并且计时器值四舍五入。如果您需要这样的精度,那么定时器粒度就是问题所在。
https://stackoverflow.com/questions/6856514
复制相似问题