clock_gettime()什么时候会使用CLOCK_MONOTONIC返回一个较小的值,因为它达到了它的最大值?我并不是说那些被描述为错误的小经线,而是像计数器重置一样。
是时间测量,还是与滴答的绝对数量相关?
我必须实现一个计时器(1或2秒间隔),我不需要那么多精度。但该应用程序可能会运行几个小时而无需重新启动。 (我估计最多1天)。
我不要害羞我不会犯任何可能导致它停止交流的错误。
timerfd是否已经解决了这个问题?
答案 0 :(得分:5)
由于struct timespec使用time_t值作为秒,因此可以涵盖的完整范围至少为68年。鉴于CLOCK_MONOTONIC的定义是从任意点开始,理论上clock_gettime可能随时超限。在实践中,如果您的应用程序运行了几十年,您只需要担心这一点。但是,如果你是偏执狂,请制作一个大声抱怨的包装函数,并在发生计时器环绕时杀死应用程序。
答案 1 :(得分:2)
CLOCK_MONOTONIC,正如“单调”名称所暗示的那样永远不会回溯,它总是在增长。如果用户或其他进程(如NTP)更改了计算机上的“墙”时钟,则不会更改。 CLOCK_MONOTONIC是定时器中使用的合适时间刻度。它最终可以滚动,但即使这样,如果你仔细地做,也可以干净利落地处理。对内部计时器使用相同类型的变量。
例如,如果时钟环绕,以下代码将正常工作。 注意:kDelayInterval必须小于环绕周期(这通常不是问题)。
struct timespec current_time; struct timespec last_update = {0,0}; . . clock_gettime(CLOCK_MONOTONIC, ¤t_time); if((current_time.tv_sec - last_update.tv_sec) > kDelayInterval) { . . . clock_gettime(CLOCK_MONOTONIC, &last_update); }