Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此代码中是否出现死锁?_C#_Multithreading_Deadlock - Fatal编程技术网

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
没有任何用处(仅基于显示的代码)是的,这是示例中的一个错误,因为它不是实际代码。我修改了它。