更新:修复代码中的增量计算,问题仍然存在
伙计们,您能否解释一下为什么我会使用以下代码不时得到非常奇怪的结果:
#include <unistd.h>
#include <sys/time.h>
#include <stdio.h>
int main()
{
struct timeval start, end;
long mtime1, mtime2, diff;
while(1)
{
gettimeofday(&start, NULL);
usleep(2000);
gettimeofday(&end, NULL);
mtime1 = (start.tv_sec * 1000 + start.tv_usec/1000.0);
mtime2 = (end.tv_sec * 1000 + end.tv_usec/1000.0);
diff = mtime2 - mtime1;
if(diff > 10)
printf("WTF: %ld\n", diff);
}
return 0;
}
(您可以使用以下命令编译和运行它:gcc test.c -o out -lrt && ./out)
我正在经历的是几乎每秒甚至更频繁的diff变量的零星大值,例如:
$ gcc test.c -o out -lrt && ./out
WTF: 14
WTF: 11
WTF: 11
WTF: 11
WTF: 14
WTF: 13
WTF: 13
WTF: 11
WTF: 16
这怎么可能?是操作系统的错吗?它是否做了太多的上下文切换?但是我的盒子是空闲的(平均负载:0.02、0.02、0.3)。
这是我的 Linux 内核版本:
$ uname -a
Linux kurluka 2.6.31-21-generic #59-Ubuntu SMP Wed Mar 24 07:28:56 UTC 2010 i686 GNU/Linux