我正在使用多线程生产者/消费者队列,其中包含一个(非常快)生产者和许多慢得多的消费者。每个消费者都可以独占访问一块物理硬件,例如电话线。生产者在主线程上运行,每个消费者在自己的线程上运行。程序启动时会创建并初始化每个消费者线程。
我尝试做的是始终使用第一个消费者(如果可用),如果它正忙,则使用第二个消费者。如果前两个忙,那么使用第三个,依此类推。如果消费者2忙,消费者2现在准备就绪,那么它应该使用第一个。
简单地锁定队列并使用monitor.pulse在生产者中生成项目并且使用者中的monitor.wait(等待条件为队列为空)不起作用,因为每个使用者都进入等待队列受线程调度程序的支配。这导致每个消费者以循环方式使用。
有没有一种简单的方法来解决这个问题?
编辑:
通过创建消费者线程锁定的硬件绑定对象列表来实现这一点,等待没有可用的对象,然后将工作项传递给获取的设备。消费者完成设备后,将其设置为可用并激活等待线程(如果有)。
答案 0 :(得分:0)
有点难以看出循环赛会出现什么问题。假设:您 想要做的是在可用时立即重复使用相同的硬件设备。因此,让这个工作,让每个消费者线程协商使用什么设备。应该很简单,List<bool>
受锁保护,以指示哪个设备可用。
答案 1 :(得分:0)
每个线程可以有一个锁定对象,当生产者创建新作业时,它会使用Monitor.TryEnter()
按顺序尝试锁定,直到成功为止。