我開發遊戲服務器,這是在C.書面和我需要開發具有特定頻率的週期(每秒50次) 執行的算法。 問題是我無法將程序暫停一段確切的時間間隔--20000微秒。 函數usleep(20000)
運行大約30000微秒。 結果總是比預期的要多10000微秒。時間延遲usleep
這裏是我的代碼簡單的例子:
#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;
}
而且它的結果的運行:
$ ./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
我還試圖用功能select()
,但結果是一樣的與sleep()
。
請向我解釋我的代碼有什麼問題。
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
相關:[睡眠一個確切的持續時間](http://stackoverflow.com/q/5209408/237483) –