C. usleep的时间延迟



我正在开发游戏服务器,它是用C语言编写的。我需要开发一个具有一定频率(每秒 50 次)的周期以执行算法。问题是我无法将程序暂停确切的时间间隔 - 20000 微秒。函数usleep(20000)运行约30000微秒。结果总是比预期多 10000 微秒。

这是我的简单代码示例:

#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: %ldn", ( 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()相同。

请向我解释一下我的代码有什么问题。

附言:

$ 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

不要睡 20000 u秒,而是根据对clock_gettime的调用,在剩余的时间内休眠,直到你想再次运行

即:

usleep( lasttime+20000-now ); // But make sure you don't sleep when the result is negative

并不是你的代码有问题,而是实际调用睡眠、读取时间等需要时间,系统无论如何都无法休眠确切的时间,除非它是其确切时钟周期的倍数

非实时系统上的休眠函数不能保证在指定的确切时间段内休眠;在繁忙的系统上,进程仅在其时间片开始时才会被唤醒。或者,正如手册页所说,"系统活动可能会使睡眠时间延长不确定的量"。

接近 10 毫秒的量听起来像是kern.hz频率降低到 100,因为有些人建议用于 VM 设置。

此问题的经典解决方法是 Ofir 提供的解决方法:指定剩余的睡眠时间,而不是指定固定的睡眠间隔。平均而言,您的循环将每 20 毫秒运行一次,这是您最有可能想要实现的目标。

在函数usleep 1000000 = 1sec。

尝试相应地更改代码。所以:

usleep(1000000) // generates 1 second delay

相关内容

  • 没有找到相关文章

最新更新