C.usleep中的时延

C.usleep中的时延,c,timedelay,usleep,C,Timedelay,Usleep,我正在开发游戏服务器,它是用C编写的。我需要开发一个循环,以特定的频率每秒50次 执行算法。 问题是我不能将程序暂停一个精确的时间间隔——20000微秒。 函数usleep20000运行约30000微秒。 结果总是比预期的要快10000微秒 下面是我的简单代码示例: 包括 包括 包括 int main int argc,字符**argv { const unsigned long nano=100000000; 无符号长t1,t2; struct-timespec-tm; 对于 { 时钟\u获取

我正在开发游戏服务器,它是用C编写的。我需要开发一个循环,以特定的频率每秒50次 执行算法。 问题是我不能将程序暂停一个精确的时间间隔——20000微秒。 函数usleep20000运行约30000微秒。 结果总是比预期的要快10000微秒

下面是我的简单代码示例:

包括 包括 包括 int main int argc,字符**argv { const unsigned long nano=100000000; 无符号长t1,t2; struct-timespec-tm; 对于 { 时钟\u获取时间时钟\u实时,&tm; t1=tm.tv\u nsec+tm.tv\u sec*nano; 美国LEEP 20000; 时钟\u获取时间时钟\u实时,&tm; t2=tm.tv\u nsec+tm.tv\u sec*nano; 打印延迟:%ld\n,t2-t1/1000; } 返回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
我也试着使用功能选择,但结果和睡眠是一样的

请给我解释一下,我的代码出了什么问题

p、 s:


根据对clock_gettime的调用,不要睡20000秒,而是睡剩下的时间,直到你想再次跑步

即:


这并不是说您的代码有问题,而是实际的睡眠调用、读取时间等需要时间,并且系统无论如何都无法在精确的时间内睡眠,除非它是其精确时钟周期的倍数,否则非实时系统上的睡眠函数不能保证在指定的精确时间内睡眠;在繁忙的系统上,进程只有在其时间片开始时才会被唤醒。或者,系统活动可能会无限延长睡眠时间

接近10毫秒的频率听起来像是kern.hz的频率降低到了100

解决这个问题的经典方法是Ofir提供的:与其指定固定的睡眠时间间隔,不如指定剩余的睡眠时间。平均而言,您的循环将每20毫秒运行一次,这是您最希望实现的。

在usleep函数中1000000=1秒

尝试相应地更改代码。因此:

usleep1000000//产生1秒延迟
相关:补充回答:sleep命令在设定的时间内释放处理器。在此延迟期间,进程不请求处理器,并且不是调度程序进程的一部分。一旦计时器过期,该进程将重新进入,与其他进程竞争CPU使用。额外的延迟来自调度器在每次选择时间选择是否选择您的程序。
$ uname -a
FreeBSD home.com 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan  3 07:46:30 UTC 2012     root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64
usleep( lasttime+20000-now ); // But make sure you don't sleep when the result is negative