此代码中是否出现任何死锁?

时间:2013-10-01 11:19:45

标签: c# multithreading deadlock

考虑传统的生产者/消费者线程示例。当消费者检查缓冲区大小不是零时,是否需要在等待锁定之前发信号通知其他线程? 这是方法代码:

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);
    }
}

1 个答案:

答案 0 :(得分:2)

不,那不会死锁:

  • 一旦生产者可以获得锁定,它会立即释放它(脉冲不会中断生产者)
  • 一旦消费者可以获得锁定,它就会找到数据,或者等待(释放锁定)

没有生产者最终等待无法获得的锁定的情况。但是,我会说,消费者中的PulseAll没有明显的目的。回答你的另一个问题:

  

是否需要在等待锁定之前发出其他线程的信号

无论如何,实际上这样做是一个非常糟糕的主意。因为如果你这样做了,即使没有任何有用的工作要做,两个消费者仍可以永远醒来

脉冲有用的唯一时间是你有理由相信有人在等待,现在可以做点什么了。如果缓冲区之前是空的(即if(buf.Count == 1)),你可以实际可能只将其减少为脉冲 - 因为如果不是为空,可能没有人在等待