Monitor.pulse方法

时间:2013-03-04 13:36:31

标签: c#

任何人都可以对这段代码有所了解。一步一步的工作?我理解的是,代码的关键部分被锁定以便一次被一个线程访问。

lock (buf)
{
    buf.AddRange(ary);
    Monitor.Pulse(buf);
}

PS:Msdn将脉冲解释为

  

脉冲(信号),PulseAll

向一个或多个等待线程发送信号。该信号通知等待线程锁定对象的状态已经改变,并且锁的所有者准备好释放锁。等待线程放在对象的就绪队列中,以便最终可以接收对象的锁定。一旦线程具有锁定,它就可以检查对象的新状态以查看是否已达到所需状态。

1 个答案:

答案 0 :(得分:0)

Monitor类为每个锁定对象维护两个队列:“就绪”队列和“等待”队列。

lock (buf)

当前线程位于Ready队列的后面,用于“buf”,然后等待轮到锁定。

我们必须假设你有其他线程使用buf,其中至少有一个叫做

Monitor.Wait(buf);

然后监视器会将其他线程放在buf的等待队列中,然后卡在那里。

现在,当前线程获得锁定时,继续执行:

Monitor.Pulse(buf);

这表示监视器将线程置于等待队列的前面,并将其移动到就绪队列的后面。另一个被卡在等待队列中的线程现在排成一行,以便在buf上获得锁定。

在锁定块结束时,会自动调用Monitor.Exit,并且当前线程不再处于buf的Ready或Waiting队列中。

不可能在锁定语句中说明为什么需要Monitor.Pulse调用,而不会看到其余的代码。

修改

这是我对发生了什么的猜测: 这可能是生产者/消费者队列模式的实现。

当消费者线程查看buf并看到没有可供他们使用的项目时,他们会调用Monitor.Wait(buf)并坐在等待队列中,直到被告知有新项目要消耗。

您要显示的代码是生产者线程向buf添加项目的时间。 然后它调用Monitor.Pulse(buf)唤醒其中一个消费者线程并将该消费者线程移动到Ready队列,等待其在buf上锁定。