Aquí hay una pequeña prueba que he escrito para verificar que el tiempo realmente solo se ejecuta en Linux.¿Cómo detener el tiempo de ejecución hacia atrás en 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;
}
prueba falla con el resultado.
tv1: 1296011067 632550
tv2: 1296011067 632549
ummm ....
¿Por qué sucede esto?
Aquí está mi configuración:
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.
Puede tener que ver con la máquina virtual. ¿Has intentado hacer esto con una instalación real de Linux? –
Asegúrese de estar comprobando la conversión de enteros en tv_sec y tv_usec cada vez que haga cálculos con ellos. –
Sospecho que es porque las llamadas de tiempo se dirigen a dos núcleos diferentes en su CPU y uno de ellos está cerca de un agujero negro en miniatura.Sal de la casa. Lo más rápido que puedas ¡Seriamente! – paxdiablo