更新:コードのデルタ計算を修正しましたが、まだ問題が残っています
皆さん、次のコードを使用して、私が時々非常に奇妙な結果を得る理由を説明していただけますか?
#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
どうすればこれが可能ですか?責任があるのはOSですか?コンテキストの切り替えが多すぎませんか?しかし、私のボックスはアイドル状態です(負荷平均: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