c++ - 读取传感器数据的线程或定时器?

标签 c++ multithreading timer synchronization

我的 Linux C++ 应用程序定期读取传感器数据。读出是通过简单的文件 I/O 操作完成的(操作系统写入文件,应用程序从该文件读取)。 关于我的平台的一些信息:

  • 我有带超线程的单核处理器
  • 传感器数据更新频率为1秒
  • 应用程序 GUI 在主线程中运行,不应被阻塞

我考虑了两种读取传感器数据的方法:

  • 在主应用程序线程中运行的计时器
  • 用无限循环分离线程,读出传感器数据然后休眠

哪种方法更有意义,还有其他选择吗?两种解决方案的成本是多少(例如,第一种方法中的主线程阻塞或第二种方法中的上下文切换)?

最佳答案

我对您的应用程序或硬件一无所知,但需要考虑以下几点:

  • 如果您使用线程,则必须创建某种通信 channel 以告知主线程数据已更新。通常这是一个 pipe(),因为信号本质上是不可靠的,并且条件锁不适用于 I/O 多路复用(即 select()/poll())。
  • 你能不阻塞地获取整组数据吗?如果是这样,那么在主线程中阅读它可能会更容易。但是,如果您的读取可以阻塞,您可能需要更多“跟踪我的读取状态以将其合并到我的中央 select()”,而线程可以阻塞直到有更多数据可用。

因此,这两种解决方案都不会自动“更容易”实现。

对于每秒只发生一次的读取,我不会担心“上下文切换”;那是无关紧要的。

关于c++ - 读取传感器数据的线程或定时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12651955/

相关文章:

c++ - 使用 "ldaps"绑定(bind)到 ldap 服务器

java - 如何使用 Java 在多线程环境中测试某些内容

java - 中断线程

c# - 控制线程数以平衡 .NET 中的 CPU 和 IO 等待

c# - Asp.NET 定时器控件不工作

c++ - 如何使用复合键获取 boost::multi_index_container 中第一个键的不同计数

c++ - 在 OpenGL 中渲染混合线

c++ - 从一个类到另一个类直接访问存储在 vector 中的数据

c - C语言中的时间中断

java - 基于网络的多用户倒计时器的设计建议