考虑传统的生产者/消费者线程示例。当消费者检查缓冲区大小不是零时,是否需要在等待锁定之前发信号通知其他线程? 这是方法代码:
public void consume()
{
lock(_lock)
{
while(buf.Count == 0)
{
// Is there any need to *Monitor.Pulse(_lock);* here?
Monitor.Wait(_lock);
}
// Consume
}
}
public void produce()
{
lock(_lock)
{
// Produce
buf.Insert(item);
Monitor.PulseAll(_lock);
}
}
答案 0 :(得分:2)
不,那不会死锁:
没有生产者最终等待无法获得的锁定的情况。但是,我会说,消费者中的PulseAll
没有明显的目的。回答你的另一个问题:
是否需要在等待锁定之前发出其他线程的信号
无论如何,实际上这样做是一个非常糟糕的主意。因为如果你这样做了,即使没有任何有用的工作要做,两个消费者仍可以永远醒来。
脉冲有用的唯一时间是你有理由相信有人在等待,现在可以做点什么了。如果缓冲区之前是空的(即if(buf.Count == 1)
),你可以实际可能只将其减少为脉冲 - 因为如果不是为空,可能没有人在等待