c++ - 在linux上每10ms定期执行一个函数

标签 c++ c linux

我目前正在开发一个必须定期执行一些工作的程序。目前我使用以下结构:

int main(int argn, char** argv) {
    for(;;) {
        //Do work - the programm spends 5-8ms here

        nanosleep(...); //Sleep 10ms
    }
    return 0;
}

问题是:一个循环执行应始终持续 10 毫秒。由于在循环的工作部分花费了大量的时间,我无法 sleep ,只是睡了 10 毫秒...

解决方案可能是使用clock_gettime()测量工作时间,并相应地调整nanosleep()。但我对这个解决方案并不满意,因为很容易将代码放置在测量区域之外......

我在互联网上搜索了替代方案,我发现了三个调用:

  • 定时器创建
  • 获取定时器
  • 闹钟
  • timerfd_create

如果该解决方案无法移植到 Windows 或其他操作系统,也没关系。

但我不确定哪种解决方案最适合我的问题。有什么意见或建议吗?我提到的 4 种替代方案有何优缺点?

编辑:此解决方案还存在另一个问题:如果我的文档正确,nanosleep 系统调用会使进程进入休眠状态至少 10 毫秒,但它如果系统处于负载状态,可能需要更长的时间...有什么方法可以优化吗?

EDIT2:供您引用:在 do work 部分中,向网络上的另一个设备(能够及时应答请求的微 Controller 或 PLC)发出网络请求。结果正在被处理并发送回设备。我知道 Linux 不是实时操作系统,也不是此类任务的最佳选择...如果解决方案不是完美的实时,也没有问题,但获得尽可能多的实时性就更好了。

最佳答案

检查调用 nanosleep 之前的时间并计算此时要 sleep 多长时间。无需测量任何代码。只需记下您从 nanosleep 返回的时间,并计算您还需要 sleep 多少时间。

关于c++ - 在linux上每10ms定期执行一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22165398/

相关文章:

c - 如何使用Makefile编译并运行这个C程序?

c - 如何在内核源文件中包含 math.h #include <math.h>?

Python 和 Django : Working on a chroot jail to run a single bash script

linux - 不知道如何在 ubuntu 中挂载文件系统

c++ - 如何在 C++ 中管理 'ostringstream' 对象?

c++ - 无法在循环 C++ 中打开文件

C 编程 : How to put integers, 将用户输入的 double 和字符串放入 3 个单独的数组中?

linux - 在 shell 脚本中,如何组合 `Rscript` 和 `Unix` 命令?

c++ - 将 C++ 头文件转换为 Python

c++ - 运行修改后的 litecoin chainparams.cpp 时遇到 "ReadBlockFromDisk: Errors in block header at CBlockDiskPos(nFile=0, nPos=8)"错误