gpt4 book ai didi

c++ - 在多线程上下文中实现实时约束

转载 作者:太空狗 更新时间:2023-10-29 21:01:56 25 4
gpt4 key购买 nike

我目前正在用 C++ 为一个必须实时轮询、处理然后显示数据(带有绘图)的程序开发 GUI。

我遇到困难的部分是代码,它在一个单独的线程中运行,实际上从一些外部硬件轮询数据然后处理它。我希望以固定的周期(即调用之间的 1/20 秒)定期调用执行此工作的函数。

我真的不知道这是否可能以及如何强制执行函数必须定期调用的事实,每秒恰好 20 次...

在阅读了一些关于实时编程的知识后,基于我在游戏开发和主游戏循环概念中学到的显着知识,我的第一个方法是使用一个循环,它会根据如何调整执行时间轮询+处理花费了很多时间:

 while(running){
//Let's assume this function get the time elapsed since
//the program started
int start = get_current_time_millisecond();

//Retrieve the data from the hardware
pollData();

//Process the data retrieved
processData();

//Queue the data wherever it is needed:
//- plotting widget of the GUI
//- recording object
dispatchProcessedData();

int elapsed = get_current_time_millisecond() - start;
int remaining = 50 - elapsed;

if(remaining > 0){
sleep(remaining);
}
}

但这似乎有缺陷,因为它可能会导致漂移问题,如果在一次迭代中耗时大于我想要坚持的时间。

这可能是因为计算花费了太多时间(我非常怀疑,但我的经验还不足以确定,分析可以帮助消除这个问题,或者至少确定代码可能需要很多时间),但我也想知道我运行多线程的事实是否会由于线程调度而导致同样的问题(同样,我对多线程很陌生,我可能完全错了)。

因此,我想问一下:

  • 是否可以通过实时编程(在多线程上下文中,如果相关)强制执行此类约束以及如何执行?
  • 在设计此类代码时我应该遵循哪些主要准则?

(如果我错过了关于这个主题的明显/容易找到的文档,我深表歉意)

谢谢!

最佳答案

除非您有外部可靠的中断源,否则很难实现这样的约束。

我相信您可以在消费类操作系统上做的最接近的事情是:

  • 确保您使用的是实时内核(例如,使用 Linux 的 RT 补丁)以尽量减少时序变化。
  • 将您的轮询线程设置为尽可能高的优先级。
  • 仅在您的轮询线程中进行轮询和调度,将所有处理留给优先级较低的线程,以便计算不会影响您的轮询。
  • 使用高精度计时器(在 Linux 上您可以使用纳秒而不是毫秒)来减少误差范围。
  • 使用无锁队列在您的轮询线程和处理线程之间进行通信,这样您就不必在轮询线程中支付互斥锁的成本(但每秒只有 20 个样本,这可能是无关紧要的)。

至少这就是我们为我们的产品所做的,它在 400 MHz CPU 上以 100Hz(10 毫秒)的频率进行轮询。你永远不会完全摆脱这种漂移,但它是非常小的。

关于c++ - 在多线程上下文中实现实时约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16795602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com