Ich entwickle den Spieleserver, der auf C geschrieben ist. Und ich muss einen Zyklus mit einer bestimmten Frequenz (50 mal pro Sekunde) entwickeln, um einen Algorithmus durchzuführen. Das Problem ist, dass ich das Programm für ein genaues Zeitintervall nicht anhalten kann - 20000 Mikrosekunden. Funktion usleep(20000)
läuft etwa 30000 Mikrosekunden. Das Ergebnis ist immer mehr auf 10000 Mikrosekunden als erwartet.Zeitverzögerung in C. usleep
Hier ist mein einfaches Beispiel Code:
#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;
}
Und das Ergebnis es läuft:
$ ./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
Ich habe auch versucht Funktion verwenden select()
, sondern Ergebnis ist das gleiche wie bei den sleep()
.
Erklären Sie mir bitte, was mit meinem Code nicht stimmt.
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
In Verbindung stehende: [Sleeping für eine genaue Dauer] (http://StackOverflow.com/q/5209408/237483) –