好吧,所以这个问题不完全是关于线程管理的......嗯,有点。我正在寻找这种配置的不同解决方案。我有一些想法,但正在寻找任何可以解决问题的解决方案。并且会权衡利弊来实施最好的。
这是情况。
我有一个将产生线程的管理器应用程序。该线程将持续运行并处理与通过 USB 连接到系统的板的串行通信。管理器应用程序促进了系统上运行的其他应用程序与该线程之间的通信。线程需要真正执行两件事:
- 通过可变计时器上的串行轮询板以获取样本数据..通常大约每分钟一次(串行总线相当慢,波特率为 4800。我无法控制这个)
- 促进与管理器应用程序的通信。(即其他应用程序将请求样本数据,管理器将请求转发给线程。线程执行操作并返回数据)
我最初的设计很简单,而且很有效。我使用队列和互斥锁进行管理器线程通信。所以线程的逻辑如下:
- 初始化
- 虽然我们还没有收到经理的关机命令
- 如果我们的计时器到了,请轮询董事会以获取数据
- 否则,检查我们是否有经理向队列发布的消息。如果是,处理它
问题是我没有考虑 CPU 利用率。99.9% 的时间我的线程什么都不处理,只是在消耗能量。我需要实现一种方法来让这个线程休眠,直到它有工作要做。所以有几个想法:
使用 select() 来阻止。这可以根据我需要使用的计时器进行阻塞,并且我可以将队列消息传递实现更改为套接字消息传递。因此,线程将向管理器打开一个客户端套接字,而管理器将通过套接字将消息传递给线程。然后 select() 会一直休眠,直到 fd 上有活动或我的计时器到时为止。
Pro:正是我需要的功能。
缺点:对于与您已经共享内存的线程的通信,套接字不是有点繁重的处理吗?
使用信号系统。(更了解 Linux 的人可以在这里提供一个实现示例……我不确定具体该怎么做。)但是线程可以在计时器的持续时间内休眠,如果有信号则唤醒以进行处理从经理那里收到。
优点:使用共享内存维护当前实现
缺点:不确定如何实施。是否有像 select() 这样的函数可以处理信号而不是 fds?
可能是互斥体。我可以阻止,直到经理发布互斥锁。
优点:仍然共享内存
缺点:可能需要将计时器处理移至管理器,这确实不是一个选项,因为它还有其他计时器和关键工作要执行。
请推荐并随时批评。我对任何有效的选择持开放态度。请注意,虽然这是在嵌入式系统上运行的,但资源使用至关重要。