时间延迟在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: %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()相同.

请告诉我,我的代码怎么了?

P.S:

$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 useconds,休眠的时间,直到你想再次运行,基于对clock_gettime的调用

即:

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

这不是你的代码有问题,但实际的睡眠呼叫,阅读时间等需要时间,并且系统无法正常睡眠,除非它是精确时钟周期的倍数

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...