请教select定时偏差,linux平台

代码如下:

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


int main()
{

    while(1)
    {
        struct timeval stStart, stEnd;
        gettimeofday(&stStart, NULL);

        struct timeval tv={0, 33000};
        select(0,NULL,NULL,NULL,&tv);

        gettimeofday(&stEnd, NULL);
        unsigned int iDelayUseTime = ((stEnd.tv_sec-stStart.tv_sec)*1000*1000+(stEnd.tv_usec-stStart.tv_usec));

        printf("use time:%u\n", iDelayUseTime);
        if(iDelayUseTime < 30000 || 35000 < iDelayUseTime)
            exit(0);
    }


    return 0;
}

运行结果:
图片说明

使用usleep的话也会出现这种情况

http://www.jb51.net/article/43199.htm

函数在处理的时候会占用时间,因此在用select做定时器的时候,最好另外起一个线程,使用多线程的select定时器。