使用IoT设备(Linux,ARM,C ++)。 现在我正在创建样板代码和通用程序结构。 该程序与不同的硬件进行通信:
现在棘手的部分是RS232设备,1线和I2C设备的响应速度不快。这意味着如果我在一个线程上做这样的事情:
while (!_isShutdown)
{
for (auto& device : _devices)
{
device.update();
}
}
我会浪费大量的时间和资源,更是如此,我无法及时完成任务,因为有几个传感器可能需要500毫秒来检索最新值。
这个问题自然导致我进行多线程处理。我可以为每个设备提供后台线程。这意味着我拥有的设备越多,我将使用的线程和内存越多(我相信1MB)。在我的情况下,管理硬件可能需要多达30个线程(我也有网络通信,这意味着更多的线程)。
我认为可能存在更好的硬件管理方法。也许每次读取执行块都是一个糟糕的设计时创建一个线程?如果是这样,有哪些替代方案?互联网上有许多简单的例子,但很少有关于复杂项目的有用资料。
在像Raspberry内存和执行速度这样的设备上不是问题,但这可能是开发愚蠢和未经优化的代码的坏习惯。我请你澄清一下。
答案 0 :(得分:1)
从您的角度来看,您没有准确解释“更好的方法”是什么。正如你所说,内存不是问题,然后为每个设备提供自己的线程可能并不那么糟糕。尽管内存消耗过多,但这样的代码很容易读取和调试。
为避免内存消耗,您可能希望从阻止代码切换到解除阻止。也就是说,线程不等待I / O操作的结束,但是硬件本身通知操作结束,例如,有硬件中断。然后,中断处理程序向其侦听器发送消息,这可能导致任务的调度在线程池上运行。 C ++中最成熟的任务库是Intel® Threading Building Blocks。任务编程看起来更复杂而不是线程,但更有趣,因为代码可以更好地达到预期的目标。
答案 1 :(得分:0)
根据我的经验,最灵活和更改的方法是使用线程:对于每个总线网络接口,都有不同的线程。最重要的是,我使用Activity设计模式,我将以安全的方式将对象作为事件处理程序提交给另一个线程。其中一些可以从这里阅读:http://tauria.ee/002/products/gradislib/