【问题标题】:.NET How to perform "sequential" thread utilization.NET 如何执行“顺序”线程利用
【发布时间】:2011-03-11 22:40:14
【问题描述】:

我正在使用一个多线程的生产者/消费者队列,其中有一个(非常快的)生产者和许多慢得多的消费者。每个消费者都可以独占访问一块物理硬件,例如电话线。生产者在主线程上运行,每个消费者在自己的线程上运行。每个消费者线程都是在程序启动时创建和初始化的。

我试图做的是始终使用第一个消费者(如果可用),如果它很忙,则使用第二个消费者。如果前两个忙,则使用第三个,依此类推。如果消费者 2 很忙,而消费者 1 现在准备好了,那么它应该使用第一个。

当项目在生产者中排队时,简单地锁定队列并使用 monitor.pulse 并在消费者中使用 monitor.wait(等待条件是队列为空)不起作用,因为每个消费者都进入等待队列受线程调度程序的支配。这导致每个消费者都以循环方式使用。

有没有简单的方法来解决这个问题?

编辑:

只是通过创建消费者线程锁定的硬件绑定对象列表来实现这一点,如果没有可用对象则等待,然后将工作项传递给获取的设备。消费者使用完设备后,会将其设置为可用并触发等待线程(如果有)。

【问题讨论】:

  • 线程通常是故意“公平”的,这与您尝试做的事情背道而驰。如果可能,请考虑使所有消费者线程等效(例如,来自 ThreadPool),并让它们在工作时从 硬件资源 的优先队列中提取。

标签: .net multithreading


【解决方案1】:

很难看出循环法会有什么问题。假设:您真正想要做的是在同一硬件设备可用时立即重复使用它。所以让它工作,让每个消费者线程协商使用什么设备。应该很简单,List<bool> 受锁保护以指示哪个设备可用。

【讨论】:

  • 您的假设是正确的:请参阅编辑了解我如何实现这一点。
【解决方案2】:

您可以为每个线程拥有一个锁对象,当生产者创建新作业时,它会使用Monitor.TryEnter() 依次尝试锁,直到成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多