简介
这篇文章主要记录我在试图解决如何尽可能精确地在某个特定的时间间隔执行某项具体任务时的思路历程,并在后期对相关的API进行的归纳和总结,以备参考。
问题引出
很多时候,我们会有类似“每隔多长时间执行某项任务 ”的需求,乍看这个问题并不难解决,实则并不容易,有很多隐含条件需要考虑,诸如:时间精度是多少?时间是否允许出现偏差,允许的偏差是多少,偏差之后如何处理?系统的负载如何?这个程序允许占用的系统资源是否有限制?这个程序运行的硬件平台如何?
为了便于分析,我们锁定题目为“每隔2妙打印当前的系统时间(距离UNIX纪元的秒数) ”。
基于sleep的朴素解法
看到这个题目,我想大家的想法和我一样,都是首先想到类似这样的解法:
|
如果对时间精度要求不高,以上代码确实能工作的很好。因为sleep的时间精度只能到1s:
|
所以对于更高的时间精度(比如说毫秒)来说,sleep就不能奏效了。如果沿着这个思路走下去,还分别有精确到微妙和纳秒的函数usleep和nanosleep可用:
|
|
既然有了能精确到纳秒的nanosleep可用,上面的较低精度的函数也就可以休息了。实际上在Linux系统下,sleep和usleep就是通过一个系统调用nanosleep实现的。
用带有超时功能的API变相实现睡眠
如果开发者不知道有usleep和nanosleep,这个时候他可能会联想到select类的系统调用:
|