c++ - C/C++——在Linux下寻找实时计时事件

标签 c++ c linux

我正在寻找一种在 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/

相关文章:

c - 如何在 c 中使用 sscanf 分隔整数值?

c++ - 什么时候使用 exit() 而不是 return?

c - 当我尝试读取 txt 文件时,它返回 : Cannot read input file

c - 从 perf 获取用户空间堆栈信息

java - 如何在Java中发现具有管理员权限的linux用户名

python - 避免对Docker产生依赖 hell

C++ 为什么不能将这两个操作组合在一行中?

c++ - 通过减少 if 语句使代码更高效

c++ - 如何根据内容与 OpenCV 对齐 2 个图像

java - C 中的 System.nanoTime() 等价物