В двух протестированных мной системах (32-разрядный сервер Ubuntu 12.04 и 64-разрядная виртуальная машина Ubuntu 13.10) секунды с начала эпохи, указанные time() может отличаться от gettimeofday().
В частности, хотя я вызываю time()
после вызова gettimeofday()
, значение, возвращаемое time()
, иногда меньше значения tv_sec
, возвращаемого gettimeofday()
.
По-видимому, это происходит сразу после того, как часы переходят на новую секунду.
Это вызвало ошибки в некоторых частях моего кода, которые ожидали, что секунды 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() second и жалуюсь только в том случае, если его значение меньше, чем у gettimeofday().
Пример вывода:
Same: 33282836
Different: 177076
Largest difference seen at 5844
То есть два значения были одинаковыми 33 миллиона раз, они были разными 177 тысяч раз, и они всегда отличались в пределах 5844 микросекунд от новой секунды.
Это известная проблема? Что вызывает это?
time()
довольно последовательно обновляется между 7000 и 7003 микросекундами после обновления значенияgettimeofday()
. В моей системе Debian x86_64 (со старым ядром) несоответствий нет. - person Keith Thompson   schedule 07.04.2014