gettimeofday возвращает неточный результат - PullRequest
0 голосов
/ 31 октября 2018

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

Я сделал простую тестовую демонстрацию, которая выявляет проблему. Это происходит только на виртуальной машине (virtualbox), на которой работает 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 с.

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

...