在精确的时间运行代码,每小时运行一次
running code at exact times, a la crond/atd
假设我正在实现一个时钟,并且我希望最小化单位时间内的唤醒次数。所以,我想被唤醒的整分钟(当我需要更新显示)。在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。我可能应该加上一个警告,我猜是相当小的:这些都不能真正保证在"准确的时间"运行。它们几乎可以保证线程的睡眠时间至少和您指定的一样长,但也可能更长——但at
和cron
也是如此。大多数典型的操作系统都不是"实时的",所以本质上任何在精确时间运行的尝试都是没有希望的,除非你对"精确"的定义非常宽松。大多数人主要感兴趣的是距离足够近,对用户来说看起来是正确的,所以任何精确度超过十分之一秒左右的东西都是不必要的。在这种情况下,您通常可以做得很好(尽管如果系统负载非常重,即使也可能是一个问题)。
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 花括号使循环运行一次?
- 如何防止我的循环额外运行一次?
- 为什么循环只运行一次?
- 谷歌测试:如何为多个测试只运行一次夹具?
- CMAKE自定义目标仅运行一次
- Qt C++每秒运行一次代码
- 为什么我的函数中的这个 for 循环只会运行一次,即使它应该运行多次?
- 为什么我的fwrite命令只运行一次
- EXIT_SUCCESS和EXIT_FAILURE.它是在任何地方运行一次编译,还是在任何地方编写一次编译
- 是一个 for 循环,最终甚至不会运行一次,就像调用 if 语句以首先检查大小一样快
- C++,查找最低值,函数错误:循环最多运行一次(循环增量从未执行)
- 当循环应该只运行一次时,执行两次while循环(C++)
- C++循环最多运行一次
- 我的C++ Unity 插件在编辑器中运行一次,但不能运行两次
- C++:GetKeyState() 必须运行一次
- 如何使函数在程序的早期运行一次
- For 循环应该运行一次,但它没有运行
- 任务调度程序:从当前时刻开始,每小时运行一次任务
- 如何在没有外部标志的情况下只在循环中运行一次代码