stop reiniciar opciones detener como comando c++ c linux time time-t

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.



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.