【发布时间】:2017-12-12 18:44:23
【问题描述】:
在物联网设备(Linux、ARM、C++)上工作。 现在我正在创建样板代码和一般程序结构。 程序与不同的硬件通信:
- 板上的 GPIO 引脚。
- 几个 1-wire 传感器。
- I2C 总线上的其他 GPIO 芯片和按键。
- 通过 RS232 接口连接的设备
现在棘手的部分是 RS232 设备、1-wire 和 I2C 设备的响应速度并不快。这意味着如果我在一个线程上做这样的事情:
while (!_isShutdown)
{
for (auto& device : _devices)
{
device.update();
}
}
我会浪费很多时间和资源,更重要的是,我无法及时完成我的任务,因为多个传感器可能需要长达 500 毫秒才能检索到最新值。
这个问题自然而然地让我想到了多线程。我可以为每个设备创建一个后台线程。这意味着我拥有的设备越多,我将使用的线程和内存(我相信 1MB)就越多。就我而言,仅管理硬件可能需要多达 30 个线程(我也有网络通信,这意味着更多线程)。
我认为也许存在更好的硬件管理方法。也许每次读取执行阻塞时创建一个线程是一个糟糕的设计?如果是这样,有哪些替代方案?网上有很多简单的例子,但对复杂项目有用的资料却很少。
在 Raspberry 内存和执行速度等设备上不是问题,但这可能会导致开发愚蠢和未优化代码的坏习惯。我请你澄清这一点。
【问题讨论】:
-
如果设备是在文件描述符接口后面抽象出来的,并且通过公共文件
read和write调用访问,请考虑使用select或epoll。它们允许您在一个线程中同时运行多个 IO 操作。 -
在tldp.org/HOWTO/text/Serial-Programming-HOWTO 的底部是一个使用
select读取两个串行端口的好例子。
标签: c++ linux multithreading