Tôi đang phát triển máy chủ trò chơi, được viết trên C. Và tôi cần phát triển một chu kỳ với tần suất nhất định (50 lần mỗi giây) để thực hiện thuật toán. Vấn đề là tôi không thể tạm dừng chương trình trong khoảng thời gian chính xác - 20000 micro giây. Chức năng usleep(20000)
chạy khoảng 30000 micro giây. Kết quả luôn cao hơn 10000 micro giây so với dự kiến.delay time in C. usleep
Dưới đây là ví dụ đơn giản của tôi mã:
#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;
}
Và kết quả của nó đang chạy:
$ ./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
Tôi cũng đã cố gắng để sử dụng chức năng select()
, nhưng kết quả cũng tương tự như với sleep()
.
Giải thích cho tôi, vui lòng, với mã của tôi có vấn đề gì.
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
Liên quan: [Ngủ trong một khoảng thời gian chính xác] (http://stackoverflow.com/q/5209408/237483) –