背景
我已经用C#实现了一段代码,相当于使用Monitor的Wait和PulseAll方法的生产者和许多消费者。
我想为生产者提供一个在生产之前等待直到所有消费者都在等待的选项。
这是消费者方的简化实现:
lock (_lock)
{
while (! _condition)
{
Monitor.Wait(_lock);
}
}
这是生产者端的简化实现:
lock (_lock)
{
_condition = true;
Monitor.PulseAll(_lock);
}
这是一种众所周知的模式,效率很高,在我的情况下效果很好。
问题
在某些情况下,我希望能够让生产者在调用上面的生产者代码之前等待,直到所有使用者都在Monitor.Wait()
调用之内。
单一消费者的解决方案概念
让我们简化针对单个消费者的问题。
该解决方案要求生产者等待附加的同步对象,使消费者可以用其进入Monitor.Wait()
的方式自动发出信号。
面向多个消费者的解决方案概念
概括上述解决方案后,所有使用者都需要访问一个线程安全计数器,该计数器将根据使用者数量进行初始化。
每个使用者都将自动调用Monitor.Wait()
并递减计数器。同样在原子调用中,每个使用者将在减量后检查计数器是否为零,如果是,则重新初始化计数器并向生产者发送信号。
摘要
在C#中的生产者和多消费者实现中,我需要允许生产者在生产之前等待所有使用者处于等待状态。
我还没有找到一种基于Monitors的方法。
我更喜欢基于Monitors的解决方案,但如果采用完全不同的方法可以简化此过程,那也很棒。