很久以前我的程序中有一个错误。根本原因是C函数
sleep(60);
在极少数情况下,睡眠时间不到60秒。或者该函数确实导致线程休眠超过60秒,但是操作系统自动更改了时钟(这似乎可能是因为错误仅发生在XX::00::00
),也就是说它很少表现出来,并且仅在“round hour”(睡眠shoudl已经结束于> xh0m0s,结束于x-1h59m59.99*s
)。答案 0 :(得分:3)
定时器肯定比睡眠更准确。睡眠仅仅是对任务调度程序恢复线程或进程的持续时间的粗略衡量。对系统时钟,重载任务调度程序等的更改将影响实际睡眠的时间长度。
计时器可以更准确地测量时间。一般而言,计时器将准确地测量时间。有两种定时器 - 基于系统时钟的定时器,如“time.h”中的功能。这些将受到系统时钟更改等因素的影响。例如 - 如果您更改系统时间,从夏令时切换,或暂停机器等,实际测量时间可能与实时不同。
另一种时钟是基于CPU滴答的高分辨率定时器。这些是像Windows上的QueryPerformanceTimer和Linux上的clock_gettime()这样的计时器。这些只是计算cpu周期。它们不会受到系统计时器更改的影响 - 但它们会以两种方式偏离现实世界时间:
您要做的是在更短的时间内睡眠并使用具有适当分辨率的时钟。例如。如果您需要睡眠不到几分钟,您应该使用高分辨率计时器。比你需要的时候多睡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:不要指望任何这些机制具有原子钟的精度。