与睡眠相比,定时器具有更好的精度()

时间:2012-06-28 16:41:07

标签: c++ c timer sleep

很久以前我的程序中有一个错误。根本原因是C函数

sleep(60);
在极少数情况下,睡眠时间不到60秒。或者该函数确实导致线程休眠超过60秒,但是操作系统自动更改了时钟(这似乎可能是因为错误仅发生在XX::00::00),也就是说它很少表现出来,并且仅在“round hour”(睡眠shoudl已经结束于> xh0m0s,结束于x-1h59m59.99*s)。
然后我的项目经理咆哮他怎么说了几百万次我们应该只使用计时器,而不是睡觉。 从那时起,我接受了定时器比睡眠更准确的概念(),但现在我觉得我应该要求一些更权威的来源。 所以:

  1. 定时器比睡眠更准确吗?
  2. (相关)他们是在内心深处(在操作系统级别上)使用不同的方法实现的吗? 我知道定时器用来做回调,睡眠只是延迟当前线程的执行,我在谈论延迟执行部分的实现。
  3. BTW OS是Linux,但如果可能的话,我会关心一般的答案。

2 个答案:

答案 0 :(得分:3)

定时器肯定比睡眠更准确。睡眠仅仅是对任务调度程序恢复线程或进程的持续时间的粗略衡量。对系统时钟,重载任务调度程序等的更改将影响实际睡眠的时间长度。

计时器可以更准确地测量时间。一般而言,计时器将准确地测量时间。有两种定时器 - 基于系统时钟的定时器,如“time.h”中的功能。这些将受到系统时钟更改等因素的影响。例如 - 如果您更改系统时间,从夏令时切换,或暂停机器等,实际测量时间可能与实时不同。

另一种时钟是基于CPU滴答的高分辨率定时器。这些是像Windows上的QueryPerformanceTimer和Linux上的clock_gettime()这样的计时器。这些只是计算cpu周期。它们不会受到系统计时器更改的影响 - 但它们会以两种方式偏离现实世界时间:

  1. 时间会长时间偏差,因为时钟分辨率不准确,因此长时间测量时间会导致cpu时间从实时偏离。
  2. 如果机器暂停,CPU将停止,计时器将不会考虑此问题。
  3. 您要做的是在更短的时间内睡眠并使用具有适当分辨率的时钟。例如。如果您需要睡眠不到几分钟,您应该使用高分辨率计时器。比你需要的时候多睡100倍,并在每次睡眠回来时查看经过的时间,看看是否已经过了适当的时间。如果您需要睡眠超过几分钟,请使用time.h中的功能来检查已用时间。

    如果你需要100%准确的时间,你可能需要专门的硬件 - 或定期检查在线时间服务器的实时 - 如海军的原子钟。 (http://tycho.usno.navy.mil/ntp.html

答案 1 :(得分:2)

没有一般性的答案,原因很简单,C或C ++标准中没有任何内容可以让应用程序进入休眠状态。因此,讨论本质上将取决于操作系统。

unix sleep()函数具有粗粒度。还有usleep()nanosleep(),它们具有更精细的粒度。函数select()也可用于使应用程序进入休眠状态。只需指定超时和无文件描述符。

注意#1:sleep()usleep()nanosleep(),itimers和警报之间的互动未指定。

注意#2:不要指望任何这些机制具有原子钟的精度。