c - C. usleep 的时间延迟

标签 c timedelay 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() 相同。

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

附:

$ 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

最佳答案

基于对 clock_gettime 的调用,不是休眠 20000 useconds,而是休眠剩余的时间直到你想再次运行

即:

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

不是你的代码有问题,而是实际调用sleep,读取时间等都需要时间,而且系统无论如何也休眠不了准确的时间,除非是它的准确时钟的倍数周期

关于c - C. usleep 的时间延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12777254/

相关文章:

c - 为什么流氓游戏使用这些对象定义?

c - C 编程中的返回值

c++ - 由于在 C++ 中使用异步 IO 而延迟我的程序而不休眠的替代方法?

c# - 指数延迟客户端 API 调用

delay - 关于在 Verilog 和时序中计算延迟的细节

c - 一个动画处理图标,纯C

Haskell:为什么 usleep + 线程编译选项比 threadDelay 更精确?

c - 延迟表初始化

c - 如何在C中从STDOUT读取直到EOF?

Java:一个去重的延时队列