В двух системах, которые я тестировал (32-разрядный сервер Ubuntu 12.04 и 64-разрядная Ubuntu 13.10 VM), секунды с момента, заданного time() может отличаться от gettimeofday().
В частности, хотя я вызываю time()
после вызова gettimeofday()
, значение, возвращаемое time()
, иногда меньше значения tv_sec
, возвращаемого gettimeofday()
.
Это, по-видимому, происходит сразу после того, как часы переходят к новой секунде.
Это вызвало ошибки в некоторых из моего кода, в которых ожидалось, что время() и 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
I.e., эти два значения были одинаковыми 33 миллиона раз, они были разными 177k раз, и они всегда отличались в течение 5844 микросекунд новой секунды.
Это известная проблема? Что вызывает это?