Estoy desarrollando el servidor del juego, que está escrito en C. Y necesito desarrollar un ciclo con una cierta frecuencia (50 veces por segundo) para realizar un algoritmo. El problema es que no puedo pausar el programa para un intervalo de tiempo exacto: 20000 microsegundos. La función usleep(20000)
se ejecuta a unos 30000 microsegundos. El resultado es siempre más en 10000 microsegundos de lo esperado.tiempo de retraso en C. usleep
Aquí está mi ejemplo simple de código:
#include <stdio.h>
#include <time.h>
#include <unistd.h>
int main(int argc, char ** argv)
{
const unsigned long long nano = 1000000000;
unsigned long long t1, t2;
struct timespec tm;
for(;;)
{
clock_gettime(CLOCK_REALTIME, &tm);
t1 = tm.tv_nsec + tm.tv_sec * nano;
usleep(20000);
clock_gettime(CLOCK_REALTIME, &tm);
t2 = tm.tv_nsec + tm.tv_sec * nano;
printf("delay: %ld\n", (t2 - t1)/1000);
}
return 0;
}
Y el resultado de que se está ejecutando:
$ ./a.out
delay: 29233
delay: 29575
delay: 29621
delay: 29694
delay: 29688
delay: 29732
delay: 29709
delay: 29706
delay: 29666
delay: 29702
delay: 29702
delay: 29705
delay: 29789
delay: 29619
delay: 29785
delay: 29634
delay: 29692
delay: 29708
delay: 29701
delay: 29703
También probé a la función select()
usar, pero resultado es el mismo que con el sleep()
.
Explícame, por favor, qué pasa con mi código.
ps:
$ uname -a
FreeBSD home.com 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:46:30 UTC 2012 [email protected]:/usr/obj/usr/src/sys/GENERIC amd64
Relacionados: [Dormir por una duración exacta] (http://stackoverflow.com/q/5209408/237483) –