【发布时间】:2012-06-22 16:49:12
【问题描述】:
我有一个程序需要每 X 秒执行一次以写入一些输出。该程序将在每个输出之间进行一些间歇性轮询和处理。因此,例如,我可能每 5 秒输出一次,但我每 0.1 秒醒来一次轮询一次,直到达到下一个 5 秒标记。该程序理论上将在重新启动之间运行数月,甚至可能更长。
我需要每隔 X 秒执行一次,以保持与挂钟一致。换句话说,我不能让时钟漂移导致我偏离 X 秒标记。在间歇轮询中,我不需要完全相同级别的准确性,但我希望轮询的频率更高,所以我需要一个可以代表亚秒级精度的结构。
我意识到,由于在操作系统上运行的本质,在执行任何计时器时都会存在一定的不一致/延迟,因此我无法保证我将在 完全处执行x 秒。但这很好,只要它保持一个小的正态分布,我不想要的是漂移让时间越来越远。
我还希望尽量减少轮询的 CPU 成本,但这是次要问题。
Linux 有哪些时序结构可以最好地为我提供这种级别的精确度?由于分发的麻烦,我试图避免在应用程序中包含提升,但如果必须的话可以使用它。所以首选使用标准 c++ 库的方法,但如果 Bosst 可以做得更好,我也想知道。
谢谢。
-ps,我不能使用 c++11。这不是一个选项,所以我无法使用它的任何构造。
【问题讨论】:
-
你的硬件平台是什么?您是否打算为您的应用程序使用实时内核和实时调度?
-
另外,您对
boost的“分发麻烦”有何期待?如果您静态链接到它,则无需部署/分发任何内容。 -
我没有实时运行。常规的 redhawk linux(可能)。我不需要实时的精确度,只是为了避免漂移。
-
提升的麻烦是由于我的雇主没有提升自己。毕竟,好的公司喜欢用愚蠢的限制来阻碍那里的员工!
-
@dsollen:PC 的内部时钟会漂移。您需要使用原子钟查询网络时间源。