具体来说,尽管我在调用
gettimeofday()
之后调用了 time()
,但 time()
返回的值有时会小于 gettimeofday()
返回的 tv_sec
值。这似乎发生在时钟滚动到新的一秒之后。
这导致我的一些代码出现错误,因为它们期望
time()
和 gettimeofday()
的秒数是可互换的。演示此问题的示例代码:
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main()
{
time_t start = time(NULL);
int same = 0;
int different = 0;
int max_usec = 0;
while (1) {
time_t t;
struct timeval tv;
gettimeofday(&tv, NULL);
t = time(NULL);
if (t < tv.tv_sec) {
different++;
if (tv.tv_usec > max_usec) {
max_usec = tv.tv_usec;
}
} else {
same++;
}
if (t > start + 5) {
break;
}
}
printf("Same: %i\n", same);
printf("Different: %i\n", different);
printf("Largest difference seen at %i\n", max_usec);
}
请注意,我调用time()函数并且只有当它的值小于gettimeofday()函数的值时才会进行抱怨。
示例输出:
Same: 33282836
Different: 177076
Largest difference seen at 5844
即两个值相同的情况出现了3300万次,不同的情况出现了177,000次,并且它们总是在新秒的5844微秒内不同。
这是一个已知的问题吗?是什么导致了这种情况?
time()
值在gettimeofday()
值更新后的7000到7003微秒之间被相当一致地更新。在我的x86_64 Debian系统上(运行较旧的内核),它没有显示任何不一致性。 - Keith Thompson