有人能对这段代码有所了解吗。一步一步地工作?我所理解的是,代码的关键部分被锁定,一次由一个线程访问。
lock (buf)
{
buf.AddRange(ary);
Monitor.Pulse(buf);
}PS: Msdn将脉冲解释为
脉冲(信号),PulseAll
向一个或多个等待线程发送信号。信号通知等待线程锁定对象的状态已经更改,并且锁的所有者已经准备好释放锁。等待线程被放置在对象的就绪队列中,以便最终接收对象的锁。一旦线程拥有了锁,它就可以检查对象的新状态,以确定是否已经达到所需的状态。
发布于 2013-03-04 13:55:40
Monitor类为每个锁定对象维护两个队列:“就绪”队列和“等待”队列。
lock (buf)当前线程被放置在"buf“的就绪队列的后面,并等待轮到它来获得锁。
我们必须假设您有其他线程使用buf,其中至少有一个线程被调用
Monitor.Wait(buf);然后,监视器会将其他线程放置在buf的等待队列中,将其卡在其中。
现在,当当前线程获得锁时,执行将继续:
Monitor.Pulse(buf);这意味着监视器接收等待队列前面的线程,并将其移动到就绪队列的后面。另一个线程,它被卡在等待队列中,现在排队等待buf上的锁。
在锁块的末尾,将自动调用Monitor.Exit,并且当前线程不再处于buf的就绪或等待队列中。
不可能在没有看到其余代码的情况下,说明为什么Monitor.Pulse调用在lock语句中是必要的。
编辑
下面是我对正在发生的事情的猜测:这可能是生产者/消费者队列模式的实现。
当使用者线程查看buf并发现没有可用的项供它们使用时,它们会调用Monitor.Wait(buf)并坐在等待队列中,直到被告知有新的项目可供使用。
您要显示的代码是当生产者线程向buf添加项时。然后调用Monitor.Pulse( buf )唤醒其中一个使用者线程并将该使用者线程移动到就绪队列,等待对buf的锁定。
https://stackoverflow.com/questions/15202828
复制相似问题