我目前正在开发一个必须定期执行一些工作的程序。目前我使用以下结构:
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/