c++ - opciones - reiniciar apache windows
¿Cómo detener el tiempo de ejecución hacia atrás en Linux? (5)
El tiempo no debería correr hacia atrás en hardware real; en una VM su millaje puede variar.
En cualquier caso, su aplicación probablemente no debería suponer que el tiempo no retrocede en una cantidad muy pequeña (supongamos, tal vez 1 segundo).
Sí, clock_gettime es bueno, pero incluso eso podría funcionar al revés en el caso de hardware defectuoso (o una máquina virtual, como en su ejemplo).
He visto un error de hardware que hace que el tiempo corra hacia atrás (aunque muy ocasionalmente), fue la causa de algunos problemas muy peculiares.
En particular, cualquier cosa que implique comparar marcas de tiempo de archivos saldrá mal cuando el tiempo retroceda.
Aquí hay una pequeña prueba que he escrito para verificar que el tiempo realmente solo se ejecuta 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;
}
La prueba falla con el resultado.
tv1: 1296011067 632550
tv2: 1296011067 632549
ummm ...
¿Por qué pasó esto?
Aquí está mi configuración:
Linux version 2.6.35-22-generic (buildd@rothera) (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.
Hay un problema abierto en VirtualBox Bug Tracker . Se vinculan a una publicación de blog que indica por qué no debes usar gettimeofday () para medir el paso del tiempo:
La forma más portátil de medir el tiempo correctamente parece ser clock_gettime (CLOCK_MONOTONIC, ...)
Los temporizadores de máquina en la mayoría de las máquinas solo tienen una precisión de uso de 15 (incluso en el código nativo). El tiempo de ''retroceso'' es extraño, pero de todos modos no se puede confiar en ese nivel (1 usec). (También tenga en cuenta que existe una diferencia entre la precisión y la precisión, la precisión de la mayoría de los temporizadores es peor que su precisión). El uso de una máquina virtual puede agravar esto también.
Actualización: error tipográfico
No es que esté funcionando al revés. Sería mejor decir que no está informando la hora correcta. Esto se debe a que las computadoras, sin la ayuda de un subsistema de temporización dedicado, simplemente no son capaces de informar el tiempo con mucha precisión en intervalos de un milisegundo.
La precisión variará con el hardware, el sistema operativo e incluso la fuente de alimentación. Aquí hay un artículo para empezar . Un poco viejo pero comunica la idea muy bien.
gettimeofday()
no se garantiza que sea monotónico. Use clock_gettime(CLOCK_MONOTONIC)
si necesita esa garantía.