Oto mały test, który napisałem, aby sprawdzić, czy czas rzeczywiście działa tylko w Linuksie.Jak zatrzymać czas przed uruchomieniem w systemie Linux?
#include <time.h>
#include <sys/time.h>
bool timeGoesForwardTest2()
{
timeval tv1, tv2;
double startTime = getTimeSeconds(); // my function
while (getTimeSeconds() - startTime < 5)
{
gettimeofday(&tv1, NULL);
gettimeofday(&tv2, NULL);
if (tv2.tv_usec == tv1.tv_usec &&
tv2.tv_sec == tv1.tv_sec)
{
continue; // Equal times are allowed.
}
// tv2 should be greater than tv1
if (!(tv2.tv_usec>tv1.tv_usec ||
tv2.tv_sec-1 == tv1.tv_sec))
{
printf("tv1: %d %d\n", int(tv1.tv_sec), int(tv1.tv_usec));
printf("tv2: %d %d\n", int(tv2.tv_sec), int(tv2.tv_usec));
return false;
}
}
return true;
}
Test kończy się niepowodzeniem z wynikiem.
tv1: 1296011067 632550
tv2: 1296011067 632549
ummm ....
Dlaczego tak się dzieje?
Oto moja konfiguracja:
Linux version 2.6.35-22-generic ([email protected]) (gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu4)) #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 (Ubuntu 2.6.35-22.33-generic 2.6.35.4)
... running inside VirtualBox 3.2.12, in Windows 7.
Może to mieć związek z maszyną wirtualną. Czy próbowałeś tego z rzeczywistą instalacją Linuksa? –
Upewnij się, że sprawdzasz całkowite przejście na tv_sec i tv_usec, gdy robisz z nimi jakiekolwiek obliczenia. –
Podejrzewam, że to dlatego, że połączenia czasowe wychodzą na dwa różne rdzenie procesora, a jeden z nich znajduje się w pobliżu miniaturowej czarnej dziury.Wyjdź z domu. Tak szybko, jak to możliwe. Poważnie! – paxdiablo