gpt4 book ai didi

c# - 在一个Producer和Multi-Consumer实现中等待所有Consumer都处于waiting状态

转载 作者:太空宇宙 更新时间:2023-11-03 11:57:56 25 4
gpt4 key购买 nike

背景

我已经用 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 的解决方案,但如果一种完全不同的方法可以使它更简单,那也很好。

最佳答案

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

关于c# - 在一个Producer和Multi-Consumer实现中等待所有Consumer都处于waiting状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58743255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com