在精确的时间运行代码,每小时运行一次

running code at exact times, a la crond/atd

本文关键字:运行 一次 每小时 代码 时间      更新时间:2023-10-16

假设我正在实现一个时钟,并且我希望最小化单位时间内的唤醒次数。所以,我想被唤醒的整分钟(当我需要更新显示)。在C(或c++)中,最好的(可移植的,最好的)方法是什么?

c++ 03和C07标准并没有真正提供任何可移植的方法来做到这一点。如果您不能依赖更新的编译器,那么您唯一合理的可移植选择可能是POSIX线程(下面将详细介绍)。

在c++ 11下,您可以创建一个线程,并使用std::sleep_until,或者(如果您喜欢,出于某种原因)std::sleep_for。选择后者的一个原因是可移植性。C1x有一个thrd_sleep函数,本质上与std::sleep_for相似,因此在两者中使用本质上相同的函数可能会更容易一些。

可移植性(在这种情况下)可能很难定义。这些函数在c++标准和C草案中都有,但它们显然都是非常新的,所以很难猜测你关心的编译器是否实际实现了它们。与此同时,它们非常紧密地基于pthread,因此可能有更好的机会看到它们已经(或很快)实现,而不是它们大多是新的和不同的。

如果你愿意只用c++,你也可以考虑Boost.thread。它与标准中的内容非常相似,但它已经在几乎所有主要的编译器和平台上可用。

如上所述,另一种可能是直接使用POSIX线程。从理论上讲,它可能不那么便携(至少从长远来看),但实际上它至少现在是便携的——特别是,它可能可以移植到所有你真正关心的平台上,这才是最重要的。显然,它们基本上可以在所有类unix平台上使用,并且还可以移植到Win32。

我可能应该加上一个警告,我猜是相当小的:这些都不能真正保证在"准确的时间"运行。它们几乎可以保证线程的睡眠时间至少和您指定的一样长,但也可能更长——但atcron也是如此。大多数典型的操作系统都不是"实时的",所以本质上任何在精确时间运行的尝试都是没有希望的,除非你对"精确"的定义非常宽松。大多数人主要感兴趣的是距离足够近,对用户来说看起来是正确的,所以任何精确度超过十分之一秒左右的东西都是不必要的。在这种情况下,您通常可以做得很好(尽管如果系统负载非常重,即使也可能是一个问题)。