概述
首先感谢如下两篇的blog,让我走出了很大的一个误区:
http://www.cppblog.com/kongque/archive/2011/01/18/138765.aspx
http://blog.csdn.net/zjwoody/article/details/7882240
在我的一个项目中,因为需要与串口通信,每次读写都需要延时usleep(1000)=1ms,但是通信量非常大,每一次工作这样的通信大概有300次左右,这样算下耗时应该是300ms左右。
但是通过strace打印出系统函数调用发现实际接近900ms,仔细观察strace日志才发现,每次usleep(1000000)其实都延时了2ms,之后上网搜索才发现usleep是不精确的。
1.sleep的精度是秒
2.usleep的精度是微妙,不精确
3.select的精度是微妙,精确
struct timeval delay;
delay.tv_sec = 0;
delay.tv_usec = 20 * 1000; // 20 ms
select(0, NULL, NULL, NULL, &delay);
4.nanosleep的精度是纳秒,不精确
unix、linux系统尽量不要使用usleep和sleep而应该使用nanosleep,使用nanosleep应注意判断返回值和错误代码,否则容易造成cpu占用率100%。
这是第一篇blog中提到的,然后第二篇blog中提供的测试代码,本人做了少量改动(原作者没有打印出usleep(0)时的信息),代码如下:
/*
最后
以上就是迷人花生为你收集整理的linux不靠谱的sleep,linux不靠谱的sleep的全部内容,希望文章能够帮你解决linux不靠谱的sleep,linux不靠谱的sleep所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复