等待所有消费者在生产者和多消费者实现中处于等待状态

问题描述 投票:0回答:1

背景

[我已经用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的解决方案,但是如果使用完全不同的方法可以简化此过程,那也很好。

c# multithreading monitor producer-consumer thread-synchronization
1个回答
0
投票

您可以为此使用CountdownEvent,消费者应该向事件发出信号,然后生产者可以等到倒计时达到零为止。

© www.soinside.com 2019 - 2024. All rights reserved.