Gettimeofday возвращает неточный результат

У меня очень странная проблема. Я использую gettimeofday для управления тайм-аутом в библиотеке ввода-вывода. Я выделил проблему, заключающуюся в том, что второй вызов gettimeofday возвращает более раннее время, чем первый.

Я сделал простую тестовую демонстрацию, которая выявляет проблему. Это происходит только на виртуальной машине (виртуальном ящике), на которой работает Ubuntu 18.04.1 LTS.

#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>

unsigned long GetTickCount()
{
    struct timeval start, end;
    unsigned long myTickCount;
    gettimeofday(&start, NULL);
    myTickCount =start.tv_sec*1000+start.tv_usec/1000;
    return myTickCount;
}


main()
{
        unsigned long a,b;
        while(1) {
                a=GetTickCount();
                usleep(100000);
                b=GetTickCount();
                if(a>b)
                        printf("a: %ld, b:%ld, b-a=%ld\r\n",a,b,b-a);
        }
}

Когда я запускаю код, я получаю что-то вроде:

a: 1540980716756, b:1540980716090, b-a=-666
a: 1540980748208, b:1540980747542, b-a=-666
a: 1540980779740, b:1540980779074, b-a=-666
a: 1540980811180, b:1540980810513, b-a=-667
a: 1540980842713, b:1540980842047, b-a=-666
a: 1540980874153, b:1540980873487, b-a=-666

Если вы внимательно его проверите, вы увидите, что сбой происходит каждые 31,5 с.

Намек на то, что происходит? Это что-то вроде дрейфа часов, регулируемого виртуальным боксом?

Это могло быть вызвано некоторой внутренней коррекцией дрейфа часов. Я подозревал, что gettimeofday() может не обеспечивать монотонность часов, и немного погуглил. Кажется, мое ощущение было правильным: gettimeofday () никогда не следует использовать для измерения времени. Чтобы узнать больше об этом (и что делать против), пожалуйста, погуглите "gettimeofday monotonic" или "linux monotonic clock".

Scheff's Cat 31.10.2018 12:13

Используйте clock_gettime() вместо: gettimeofday() устарел.

pmg 31.10.2018 15:29

@Scheff clock_gettime с CLOCK_MONOTONIC / CLOCK_MONOTONIC_RAW выглядит как способ выполнять операции с правильным временем.

Mquinteiro 31.10.2018 15:51

@Mquinteiro Я не искал дубликат, и никто больше не жаловался. Последний позволил мне подумать, что стоит самостоятельный ответ.

Scheff's Cat 31.10.2018 15:56

@Scheff это очень похоже на дублирование, stackoverflow.com/questions/4801122/…

Mquinteiro 31.10.2018 17:16

Возможный дубликат Как остановить обратное движение времени в Linux?

Mquinteiro 31.10.2018 17:17

Что такое sizeof(long)? Достаточно ли удерживать секунды с эпохи, умноженной на 1000?

AlexP 31.10.2018 17:59
2
7
443
0

Другие вопросы по теме