背景
我用C#实现了一段代码,它相当于一个生产者,使用监视器的Wait和PulseAll方法拥有许多消费者。
我想为生产者提供一个选项,让他们在生产之前等待,直到所有消费者都在等待。
这是消费者端的简化实现:
lock (_lock)
{
while (! _condition)
{
Monitor.Wait(_lock);
}
}这是生产者端的简化实现:
lock (_lock)
{
_condition = true;
Monitor.PulseAll(_lock);
}这是一个众所周知的模式,它相当有效,并且在我的情况下工作得很好。
问题所在
在某些情况下,我希望能够让生产者在调用上面的生产者代码之前等待,直到所有消费者都在Monitor.Wait()调用中。
面向单一消费者的解决方案概念
让我们将问题简化为单个消费者的情况。该解决方案要求生产者等待一个额外的同步对象,消费者可以通过它的Monitor.Wait()入口自动发出信号。
针对多个消费者的解决方案概念
概括上述解决方案,所有消费者都需要访问一个线程安全计数器,该计数器是用消费者的数量初始化的。
每个消费者将自动调用Monitor.Wait()并递减计数器。此外,在原子调用中,每个消费者将在递减之后检查计数器是否为零,如果是,则重新初始化计数器并向生产者发送信号。
摘要
在C#中的生产者和多消费者实现中,我需要允许生产者在生产之前等待所有消费者处于等待状态。
我还没有找到一种基于监视器来实现这一点的方法。
我更喜欢基于监视器的解决方案,但如果一种完全不同的方法可以让这件事变得更简单,那也是很好的。
发布于 2019-11-07 15:33:04
您可以为此使用CountdownEvent,消费者应该向事件发送信号,然后生产者可以等待进入锁,直到倒计时到零。
https://stackoverflow.com/questions/58743255
复制相似问题