任何人都可以对这段代码有所了解。一步一步的工作?我理解的是,代码的关键部分被锁定以便一次被一个线程访问。
lock (buf)
{
buf.AddRange(ary);
Monitor.Pulse(buf);
}
PS:Msdn将脉冲解释为
脉冲(信号),PulseAll
向一个或多个等待线程发送信号。该信号通知等待线程锁定对象的状态已经改变,并且锁的所有者准备好释放锁。等待线程放在对象的就绪队列中,以便最终可以接收对象的锁定。一旦线程具有锁定,它就可以检查对象的新状态以查看是否已达到所需状态。
答案 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上锁定。