【发布时间】:2011-03-11 22:40:14
【问题描述】:
我正在使用一个多线程的生产者/消费者队列,其中有一个(非常快的)生产者和许多慢得多的消费者。每个消费者都可以独占访问一块物理硬件,例如电话线。生产者在主线程上运行,每个消费者在自己的线程上运行。每个消费者线程都是在程序启动时创建和初始化的。
我试图做的是始终使用第一个消费者(如果可用),如果它很忙,则使用第二个消费者。如果前两个忙,则使用第三个,依此类推。如果消费者 2 很忙,而消费者 1 现在准备好了,那么它应该使用第一个。
当项目在生产者中排队时,简单地锁定队列并使用 monitor.pulse 并在消费者中使用 monitor.wait(等待条件是队列为空)不起作用,因为每个消费者都进入等待队列受线程调度程序的支配。这导致每个消费者都以循环方式使用。
有没有简单的方法来解决这个问题?
编辑:
只是通过创建消费者线程锁定的硬件绑定对象列表来实现这一点,如果没有可用对象则等待,然后将工作项传递给获取的设备。消费者使用完设备后,会将其设置为可用并触发等待线程(如果有)。
【问题讨论】:
-
线程通常是故意“公平”的,这与您尝试做的事情背道而驰。如果可能,请考虑使所有消费者线程等效(例如,来自 ThreadPool),并让它们在工作时从 硬件资源 的优先队列中提取。
标签: .net multithreading