У меня очень странная проблема. Я использую 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 с.
Какой-то намек на то, что происходит?
Это своего рода смещение часов, настроенное виртуальной коробкой?