在确切的时间运行代码,la crond / atd

时间:2011-10-20 14:29:06

标签: c++ c time

假设我正在实现一个时钟,我想减少每单位时间的唤醒次数。所以,我只想在完整的几分钟内醒来(当我需要更新显示器时)。在C(或C ++)中,最好的方法(可移植,最好)是什么?

1 个答案:

答案 0 :(得分:3)

C ++ 03和C07标准并没有真正提供任何可移植的方法。如果您不能依赖于更新的编译器,那么几乎您唯一合理的便携式选择可能就是POSIX线程(下面还有更多)。

在C ++ 11下,您可以创建一个主题,并使用std::sleep_until或(如果您愿意,出于某种原因)std::sleep_for。优先选择后者的一个原因是可移植性C. C1x具有thrd_sleep函数,它基本上类似于std::sleep_for,因此在两者中使用基本相同的函数可能会更容易一些。

可移植性(在这种情况下)可能很难定义。这些函数属于C ++标准和C草案,但这些函数显然都是新的,所以很难猜测你关心的编译器是否实际实现了它们。与此同时,他们在pthreads上的基础非常密切,所以可能已经(或很快)实现它们的可能性要大于新的和不同的。

如果您愿意将自己限制在C ++中,您可能还会考虑Boost.thread。它与标准中的内容非常相似,但它已经可用于几乎所有主要的编译器和平台。

如上所述,另一种可能性是直接使用POSIX线程。从理论上讲,这可能不是那么便携(至少从长远来看),但实际上它现在可能至少是可移植的 - 特别是,它可以移植到你真正关心的所有平台上,这是大多数真正重要的事情。显然,它们几乎可以在所有类Unix平台上使用,并且还有一个port to Win32

我应该添加一个我认为非常小的警告:这些都不能确保在“确切的时间”运行。它们几乎可以保证你的线程至少会在你指定的时间内休眠,但它可能会更长 - 但对于atcron来说也是如此。大多数典型的操作系统都不是“实时”的,所以基本上任何在准确时间运行的尝试都是没有希望的,除非你非常松散地定义“精确”。大多数人主要感兴趣的是足够接近它看起来并且对用户来说是正确的,所以任何比十分之一秒左右更精确的东西都是不必要的。在这种情况下,你通常可以做得很好(尽管如果系统真的负载很重,即使可能也是一个问题)。