我有一个ASP.NET中的生产者-消费者场景。我设计了一个Producer
类,一个Consumer
类和一个用于持有共享对象并负责生产者和消费者之间通信的类,我们称其为Mediator
。因为我在启动时(在父对象中)分叉执行路径,一个线程将调用Producer.Start()
,另一个线程将调用Consumer.Start()
,所以我需要通过Constructor
将Mediator
的引用传递给Producer
和Consumer
。 Mediator
是一个智能类,它将优化许多事情,如其内部队列的长度,但现在先将其视为循环阻塞队列。 Producer
会将新对象入队到Mediator
,直到队列满了,然后Producer
将阻塞。Consumer
从Mediator
中出队对象,直到队列中没有任何东西。为了在线程之间进行信号传递,我在Mediator
类中实现了两种方法:Wait()
和Pulse()
。代码大致如下:
Class Mediator
{
private object _locker = new object();
public void Wait()
{
lock(_locker)
Monitor.Wait(_locker);
}
public void Pulse()
{
lock(_locker)
Monitor.Pulse(_locker);
}
}
// This way threads are signaling:
Class Consumer
{
object x;
if (Mediator.TryDequeue(out x))
// Do something
else
Mediator.Wait();
}
在 Mediator 中,每当有东西被 Enqueued 或 Dequeued 时,我使用 this.Pulse() 来通知等待的线程继续工作。但是我遇到了死锁问题,因为我从未使用过这种设计来通知线程,所以我不确定是设计有问题还是我在其他地方做错了什么?谢谢。