我正在寻找一种在 Linux 下使用 C/C++ 执行计时事件的方法。
例如。每 100 毫秒执行一段代码。 (不多不少,软实时)
到目前为止我看到的唯一选项是:
- 无限循环,每次检查是否到执行时间。
- 休眠线程直到它运行。
无限检查是否到了运行时间,缺点是它(太)占用 CPU。
睡到时间到了,缺点是不精确。 sleep 时间只是一个引用值,它可以睡得更久。
现在我想知道你们中是否有人知道如何在 Linux 下用 C/C++ 进行实时计时事件。
最佳答案
您要使用什么几乎无关紧要 — select()
、epoll()
、usleep()
、 settimer()
。有些方法可以“采取”更高分辨率的超时,有些则不能。但是 Linux 不是一个实时操作系统,甚至不应该期望它会恰好在那个时间唤醒您的进程。现在,即使您旋转 CPU,如果内核决定将该 CPU 分配给其他进程或中断处理程序,内核也可以轻松挂起您的进程。
从 API 的角度(以及最近的趋势)来看,您应该坚持使用 timerfd()
— 你可以告诉它使用什么时钟,它与其他 Linux 事件调度机制(epoll、AIO 等)很好地集成。
除此之外,它不在你作为程序员的控制范围内。为了从 Linux 获得近乎实时的行为,通常需要付出很大的努力。它的范围从构建自定义修补内核和为整个世界配置亲和性(包括屏蔽中断)到修补 BIOS 和调整硬件。
实际上,假设您在负载不高的商用 x86_64 服务器上运行全新的 vanilla 内核,预计您的唤醒时间约为 50 µs(您可以轻松地对其进行基准测试以大致了解您的系统)。
关于c++ - C/C++——在Linux下寻找实时计时事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15143521/