Ecco un piccolo test che ho scritto per verificare che il tempo effettivamente funzioni solo in Linux.Come fermare il tempo a correre indietro su 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;
}
Il test ha esito negativo con il risultato.
tv1: 1296011067 632550
tv2: 1296011067 632549
ummm ....
Perché accade questo?
Ecco la mia messa a punto:
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.
Potrebbe avere a che fare con la VM. Hai provato a farlo con una vera installazione Linux? –
Assicurati di controllare il rollover di interi su tv_sec e tv_usec ogni volta che esegui calcoli con loro. –
Sospetto che sia perché le chiamate di tempo escono da due core diversi sulla CPU e uno di loro si trova in prossimità di un buco nero in miniatura.Esci di casa. Il più velocemente possibile. Sul serio! – paxdiablo