C usleep()用于计算运行时间的行为异常

C usleep()用于计算运行时间的行为异常,c,gettimeofday,usleep,C,Gettimeofday,Usleep,我使用下面的代码计算每个连续调用处理函数所花费的时间(毫秒)。当我使用usleep1000(即1毫秒)时,每次调用之间的时间差为10毫秒;当我使用usleep1000000(即1秒)时,每次调用之间的时间间隔下降到1毫秒以下。以下是代码片段: #include<stdio.h> #include<stdlib.h> #include<sys/time.h> #include<unistd.h> struct

我使用下面的代码计算每个连续调用处理函数所花费的时间(毫秒)。当我使用usleep1000(即1毫秒)时,每次调用之间的时间差为10毫秒;当我使用usleep1000000(即1秒)时,每次调用之间的时间间隔下降到1毫秒以下。以下是代码片段:

    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/time.h>
    #include<unistd.h>

    struct timeval start_time;
    void handler(int);

    int main()
    {
            struct timeval current_time;
            int i=0;
            gettimeofday(&start_time,0);
            gettimeofday(&current_time,0);
            printf("%012.3fms: emulationbegins\n",((current_time.tv_usec-start_time.tv_usec)/1000.0));

            while(i++<5)
            {
                    usleep(1000); // compare with usleep(1000000)
                    handler(i);
            }

            return 0;
    }

    void handler(int i)
    {
            printf("In Handler %d\n",i);
            struct timeval current_time;
            gettimeofday(&current_time,0);
            printf("%012.3fms: Handler Called\n",((current_time.tv_usec-start_time.tv_usec)/1000.0));
            return;
    }
请记住,timeval结构的tv_usec字段永远不会达到或超过一百万,相反,秒数会增加

在计算中还必须使用tv_sec字段。

usleep被指定为睡眠至少与您给定的睡眠量相同,但它可以睡得更长。对于它的睡眠时间几乎没有上限,因为如果操作系统有更重要的进程要运行,它就不必运行您的进程

实际上,usleep睡眠时间的分辨率取决于操作系统使用的时钟。直到几年前,大多数类unix系统都使用静态100Hz定时器或1024Hz(在某些罕见的情况下)来驱动这样的定时器,因此您的usleep总是被四舍五入到最接近的10ms

最近在一些系统上做了一些消除静态时钟的工作,尽管这并不是因为需要更高分辨率的休眠,而是因为不断唤醒cpu以获取静态时钟对功耗有害。它可能会有一个副作用,即提高计时器分辨率,但这反过来又会暴露出应用程序中的错误,这些应用程序使用很短的睡眠时间,并且似乎表现正常。突然间,由于usleep/nanosleep/poll/select中超时的分辨率更高,这些短睡眠会导致应用程序在cpu上旋转,从而一直重新安排睡眠时间


我不确定现在的状态是什么,但从10毫秒看,您的系统似乎仍然使用100赫兹的时钟作为内部计时器,或者它故意将超时速度降低到10毫秒的分辨率,以防止应用程序中断。

Ya我错过了这一点。。。谢谢我还有一个相关的问题。纠正错误后,usleep1000和usleep1000000显示出合理的差异,但usleep1000和usleep5000几乎相同。为什么???@vikas_2kx usleep函数睡眠时间至少达到给定的数量,如果计时器分辨率不够高,它实际上可能睡眠时间更长。哦,谢谢你提供的信息。这解释了很多。