Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 控制不同的硬件:多线程还是其他什么?_C++_Linux_Multithreading - Fatal编程技术网

C++ 控制不同的硬件:多线程还是其他什么?

C++ 控制不同的硬件:多线程还是其他什么?,c++,linux,multithreading,C++,Linux,Multithreading,在物联网设备上工作(Linux、ARM、C++)。 现在我正在创建样板代码和通用程序结构。 该程序与不同的硬件进行通信: 板上的GPIO引脚 多个单线传感器 I2C总线上的其他GPIO芯片和键 通过RS232接口连接的设备 现在棘手的是RS232设备、单线和I2C设备的响应速度不够快。这意味着如果我在一个线程上执行类似的操作: while (!_isShutdown) { for (auto& device : _devices) {

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

  • 板上的GPIO引脚
  • 多个单线传感器
  • I2C总线上的其他GPIO芯片和键
  • 通过RS232接口连接的设备
现在棘手的是RS232设备、单线和I2C设备的响应速度不够快。这意味着如果我在一个线程上执行类似的操作:

    while (!_isShutdown)
    {
        for (auto& device : _devices)
        {
            device.update();
        }
    }
我将浪费大量的时间和资源,更重要的是,我无法及时完成任务,因为几个传感器可能需要500毫秒才能检索到最新的值

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

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


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

从你的观点来看,你没有确切解释什么是“更好的方法”。正如您所说的,内存不是问题,因此为每个设备提供自己的线程也没那么糟糕。尽管内存消耗过多,但这样的代码很容易读取和调试


为了避免内存消耗,您可能需要从阻塞代码切换到取消阻塞。也就是说,线程不会等待I/O操作结束,但硬件本身会通知操作结束,例如,通过硬件中断。然后,中断处理程序向其侦听器发送一条消息,这可能导致任务调度在线程池上运行。C++中最成熟的任务库是。在任务中编程似乎比在线程中编程更复杂,但更有趣,因为这样可以使代码更适合于预期目标。

根据我的经验,最灵活和抗更改的方法是使用线程:对于每个总线网络接口,都有不同的线程。在此基础上,我使用活动设计模式,在这里我将以安全的方式将一个对象作为事件处理程序提交给另一个线程。其中的一些可以从这里读取:

如果设备被抽象在文件描述符接口后面,并用通用文件<代码> Read 和<代码>写< /代码>调用,请考虑使用<代码>选择< /代码>或<代码> ePoop<>代码>。它们允许您在一个线程中同时运行多个IO操作。下面是一个使用
select
读取两个串行端口的好例子。我完全错过了
select
方法。我想最后的答案是
select
for I/O reads与您提到的库(用于更高级的逻辑)相结合。顺便问一下,您对微软的pplx任务(作为cpprestsdk的一部分)有什么看法?以前从未听说过pplx任务。请阅读以下内容: