Linux中用的是时间片轮转算法,进程轮训要消耗时间,转换到一个进程来执行要消耗时间。结果在进程睡眠和运行过程中,许多时间已经过去了。
sleep()是以秒为单位的,要想延迟一个较小的时间,就需要用到usleep()。
另外还有个nanosleep(),用法好像很复杂。
usleep可能很难保证时间精度。我写了一段测试代码
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/time.h>
- int main(void)
- {
- int i;
- struct timeval tvTotal;
- struct timeval tvBegin, tvEnd, tvSub;
- tvTotal.tv_sec = 0;
- tvTotal.tv_usec = 0;
- for (i = 0; i < 100; i++)
- {
- gettimeofday(&tvBegin, NULL);
- usleep(1000); // 1000 us(microsecond/微秒) = 1 ms(毫秒)
- gettimeofday(&tvEnd, NULL);
- timersub(&tvEnd, &tvBegin, &tvSub);
- tvTotal.tv_sec += tvSub.tv_sec;
- tvTotal.tv_usec += tvSub.tv_usec;
- printf("%d\n", tvSub.tv_usec);
- }
- printf("try to usleep 1000 us 100 times, average of result is: %ld\n", tvTotal.tv_sec*1000*10+tvTotal.tv_usec/100);
- return 0;
- }