gpt4 book ai didi

c - 我需要实现一种方法让这个线程休眠直到它有工作要做

转载 作者:IT王子 更新时间:2023-10-29 00:05:18 25 4
gpt4 key购买 nike

好吧,所以这个问题不完全是关于线程管理的……好吧,有点。我正在寻找此配置的不同解决方案。我有一些想法,但正在寻找可以解决问题的任何解决方案。并将权衡利弊以实现最佳方案。

情况是这样的。

我有一个会生成线程的管理器应用程序。该线程将持续运行并处理与通过 USB 连接到系统的电路板的串行通信。管理器应用程序促进系统上运行的其他应用程序与该线程之间的通信。线程需要真正执行两件事:

  1. 在可变定时器上通过串行轮询电路板以获取示例数据。通常大约每分钟一次(串行总线相当慢,波特率为 4800。我无法控制)
  2. 促进与经理应用程序的沟通。 (即其他应用程序将请求样本数据,管理器将请求转发给线程。线程执行操作并返回数据)

我最初的设计很简单并且很有效。我使用队列和互斥锁来进行管理器线程通信。所以线程的逻辑如下:

  1. 初始化
  2. 虽然我们还没有收到经理的关机命令
  3. 如果我们的计时器已到,请轮询板以获取数据
  4. 否则,请检查我们是否有经理向队列发布的消息。如果是,处理它

问题是我没有考虑CPU利用率。 99.9% 的时间我的线程什么都不处理,只是在消耗能量。我需要实现一种方法来休眠该线程,直到它有工作要做。所以有几个想法:

Use select() to block. This can block based on the timer I need to use, and I could change the queue messaging implementation to socket messaging. So instead, the thread would open a client socket to the manager and the manager would pass the messages over the socket to the thread. Then select() would sleep until there was activity on the fd or my timer was up.

Pro:正是我需要的功能。

缺点:与已经共享内存的线程通信时,套接字的处理量是否有点大?

Use a signal system. (Someone more knowledgeable in Linux can pipe up here with an implementation example... I'm not sure exactly how to do it.) But the thread could sleep for the duration of the timer, and wake up to process if a signal was received from the manager.

优点:使用共享内存维护当前实现

缺点:不确定如何实现。是否有像 select() 这样的函数可以处理信号而不是 fds?

Potentially a mutex. I could block until a mutex was posted to by the manager.

Pro:仍然共享内存

缺点:可能需要将计时器处理移交给管理器,这确实不是一个选项,因为它还有其他计时器和关键工作要执行。

欢迎推荐,欢迎批评指正。我愿意接受任何有效的选择。请注意,尽管这是在嵌入式系统上运行,因此资源使用至关重要。

最佳答案

处理这种情况的经典工具是信号量,而不是互斥锁或条件变量。将它们视为从管理器传递到线程的 token 。

线程可以使用sem_timedwait 确保偶尔醒来检查数据。

注意捕获sem_ 函数的错误返回,它们是可中断的。因此,您醒来的次数可能比您想象的要多一些。

关于c - 我需要实现一种方法让这个线程休眠直到它有工作要做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com