gpt4 book ai didi

c - 根据 settimeofday 调整基于 CLOCK_REALTIME 的计时器

转载 作者:行者123 更新时间:2023-11-30 16:39:33 25 4
gpt4 key购买 nike

我有一个 POSIX 计时器,每次凌晨 3 点左右都会触发。

明显的实现是将 timer_createCLOCK_REALTIME 结合使用,并将超时设置为凌晨 3 点,根据当前时间,可以是今天或明天。

这适用于所有情况,除非系统时间向后修正。如果用户将时钟设置为 future 一年,然后回到正确的日期,则新的计时器值将设置为一年内的明天,因此计时器不会经过一整年。

作为一种解决方法,我可以确定每个重复计时器应在何时发生上一次超时,并且如果我在此之前看到系统时间,我会更正所有现有计时器,但这仍然需要单独的唤醒原因。

如果系统时钟向后设置(通常或在给定时间之前),是否有办法收到通知,或者是否有更好的方法来处理此问题?

最佳答案

首先,我认为你想得太多了 - 现在是 2017 年,系统时钟除了在启动时不需要设置(而不仅仅是漂移校正),而且时钟的误差永远不应该超过几个毫秒(最好是微秒),全部通过 ntp、ptp 或类似工具保持正确的形状。在我的书中,简单地记录您的软件在不连续的时钟调整下不会按预期运行是完全可以接受的。

如果您不能接受,您的选择就受到限制:

  • 您可以使用 CLOCK_MONOTONIC 代替 CLOCK_REALTIME,并使用凌晨 3 点与当前时间之间的差值设置计时器,而不使用 TIMER_ABSTIMECLOCK_REALTIME 报告的时间作为间隔。这样做的好处是,即使任意重置时钟,您也不会错过凌晨 3 点的事件超过 24 小时,但如果调整一天中的时间,您仍然可能会错过它。

  • 使用到期时间较短的计时器,并轮询每个计时器,即使您刚刚跨过凌晨 3 点边界。这永远不会错过超过计时器间隔的事件,但会浪费大量的 CPU 资源(并阻止深度 sleep )轮询。

这些方法还有其他变体,但就优缺点而言,它们基本上是相同的。

关于c - 根据 settimeofday 调整基于 CLOCK_REALTIME 的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46996157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com