C# 此代码中是否出现死锁?
以传统的生产者/消费者线程为例。当使用者检查缓冲区大小是否不为零时,是否需要在等待锁定之前向其他线程发送信号? 以下是方法代码:C# 此代码中是否出现死锁?,c#,multithreading,deadlock,C#,Multithreading,Deadlock,以传统的生产者/消费者线程为例。当使用者检查缓冲区大小是否不为零时,是否需要在等待锁定之前向其他线程发送信号? 以下是方法代码: public void consume() { lock(_lock) { while(buf.Count == 0) { // Is there any need to *Monitor.Pulse(_lock);* here? Monitor.Wait(_lock)
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);
}
}
不,这不会死锁:
- 一旦生产者可以得到锁,它会立即释放它(脉冲不会中断生产者)
- 一旦使用者能够获得锁,它要么查找数据,要么适当地等待(释放锁)
pulsell
没有明显的用途。要回答您的另一个问题:
在等待锁定之前是否需要向其他线程发送信号
没有,事实上,这样做是一个非常糟糕的主意。因为如果你这样做,两个消费者可能会永远吵醒对方,即使没有有用的工作要做
只有当你有理由相信有人在等待,并且现在可以做些什么的时候,脉搏才是有用的。实际上,如果缓冲区以前是空的(即,
if(buf.Count==1)
),您可能会将其减少为仅脉冲-因为如果缓冲区不是空的,可能没有人在等待。@SAM监视器。生产者中的脉冲
对于唤醒等待的消费者是必要且重要的。但是,消费者中的Monitor.Pulse
没有任何用处(仅基于显示的代码)是的,这是示例中的一个错误,因为它不是实际代码。我修改了它。