首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在生产者和多消费者实现中等待所有消费者处于等待状态

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

Stack Overflow用户
提问于 2019-11-07 14:41:25
回答 1查看 61关注 0票数 2

背景

我用C#实现了一段代码,它相当于一个生产者,使用监视器的Wait和PulseAll方法拥有许多消费者。

我想为生产者提供一个选项,让他们在生产之前等待,直到所有消费者都在等待。

这是消费者端的简化实现:

代码语言:javascript
运行
复制
lock (_lock)
{
    while (! _condition)
    {
        Monitor.Wait(_lock);
    }
}

这是生产者端的简化实现:

代码语言:javascript
运行
复制
lock (_lock)
{
    _condition = true;
    Monitor.PulseAll(_lock);
}

这是一个众所周知的模式,它相当有效,并且在我的情况下工作得很好。

问题所在

在某些情况下,我希望能够让生产者在调用上面的生产者代码之前等待,直到所有消费者都在Monitor.Wait()调用中。

面向单一消费者的解决方案概念

让我们将问题简化为单个消费者的情况。该解决方案要求生产者等待一个额外的同步对象,消费者可以通过它的Monitor.Wait()入口自动发出信号。

针对多个消费者的解决方案概念

概括上述解决方案,所有消费者都需要访问一个线程安全计数器,该计数器是用消费者的数量初始化的。

每个消费者将自动调用Monitor.Wait()并递减计数器。此外,在原子调用中,每个消费者将在递减之后检查计数器是否为零,如果是,则重新初始化计数器并向生产者发送信号。

摘要

在C#中的生产者和多消费者实现中,我需要允许生产者在生产之前等待所有消费者处于等待状态。

我还没有找到一种基于监视器来实现这一点的方法。

我更喜欢基于监视器的解决方案,但如果一种完全不同的方法可以让这件事变得更简单,那也是很好的。

EN

Stack Overflow用户

发布于 2019-11-07 15:33:04

您可以为此使用CountdownEvent,消费者应该向事件发送信号,然后生产者可以等待进入锁,直到倒计时到零。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58743255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档