[我已经用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的解决方案,但是如果使用完全不同的方法可以简化此过程,那也很好。
您可以为此使用CountdownEvent,消费者应该向事件发出信号,然后生产者可以等到倒计时达到零为止。