c++ - 控制不同的硬件 : multithreading or something different?

标签 c++ linux multithreading

在 IoT 设备(Linux、ARM、C++)上工作。 现在我正在创建样板代码和通用程序结构。 该程序与不同的硬件通信:

  • 板上的 GPIO 引脚。
  • 几个单线传感器。
  • I2C 总线上的其他 GPIO 芯片和按键。
  • 通过RS232接口(interface)连接的设备

现在棘手的部分是 RS232 设备、1-wire 和 I2C 设备的响应速度不是那么快。这意味着如果我在单个线程上做这样的事情:

    while (!_isShutdown)
    {
        for (auto& device : _devices)
        {
            device.update();
        }
    }

我会浪费很多时间和资源,更重要的是,我无法及时完成任务,因为多个传感器可能需要长达 500 毫秒才能检索到最新值。

这个问题自然而然地让我想到了多线程。我可以为每个设备创建一个后台线程。这意味着我拥有的设备越多,我使用的线程和内存(我相信 1MB)就越多。在我的例子中,可能需要多达 30 个线程来管理硬件(我也有网络通信,这意味着更多线程)。

我认为也许存在更好的硬件管理方法。也许每次读取执行 block 时创建一个线程是一个糟糕的设计?如果是这样,有哪些替代方案?网上有很多简单的例子,但对复杂项目有用的资料很少。

在像 Raspberry 这样的设备上,内存和执行速度不是问题,但这可能会养成开发愚蠢和未优化代码的坏习惯。我请你澄清这一点。

最佳答案

从您的角度来看,您没有准确解释什么是“更好的方法”。既然如您所说,内存不是问题,那么为每个设备提供自己的线程也不错。尽管内存消耗过多,但这样的代码很容易阅读和调试。

为避免内存消耗,您可能希望从阻塞代码切换到解除阻塞。也就是说,线程不会等待 I/O 操作结束,而是硬件本身通知操作结束,例如带有硬件中断。中断处理程序然后向其监听器发送消息,这可能会导致任务调度在线程池上运行。 C++中最成熟的任务库是Intel® Threading Building Blocks .在任务中编程似乎比在线程中更复杂,但更有趣,因为可以生成更适合预期目标的代码。

关于c++ - 控制不同的硬件 : multithreading or something different?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47779500/

相关文章:

c# - 限制单次执行一个方法的线程数

c++ - 结构 vector C++

php - 为什么这个 shell 脚本没有按预期从 PHP 运行?

linux - 在 Linux 服务器上构建 windows 7z SelF-eXtracting 安装程序,如何更改 exe 图标?

c++ - 通过引用线程对象传递取消引用的 `this` 指针,在函数对象构造函数中创建线程是好是坏?

Python线程While循环阻塞了程序的其余部分?

c++ - 无法使用 Crypto++ 进行 RSA 加密/解密(isValidCoding 为 false)

c++ - 如何为您自己的类型提供免费的开始/结束功能

c++ - 与 std::atomic 相反,读取互斥量范围之外的 volatile 变量

linux - 如何从多个日志文件中提取同一位置的数字