当我使用setitimer
设置短暂超时,然后在Linux 2.6.26系统(Debian 5.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
这是有问题的,因为我们使用在一些计算后报告为剩余的时间,并且它们也太大了。
这是一个已知问题吗? (谷歌搜索没有用。)有没有人有一个很好的解决方法?
答案 0 :(得分:1)
在POSIX documentation of the setitimer
function中有一个注释
实现可能会限制计时器值的粒度。对于每个间隔计时器,如果请求的计时器值需要比实现支持的更精细的粒度,则实际计时器值应向上舍入到下一个支持的值
系统中的粒度似乎高于1000 usec(似乎是6000 usec)并且计时器值被四舍五入。如果您需要这样的精度,那么计时器粒度就是问题。