首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Monitor.pulse法

Monitor.pulse法
EN

Stack Overflow用户
提问于 2013-03-04 13:36:30
回答 1查看 344关注 0票数 1

有人能对这段代码有所了解吗。一步一步地工作?我所理解的是,代码的关键部分被锁定,一次由一个线程访问。

代码语言:javascript
复制
lock (buf)
{
    buf.AddRange(ary);
    Monitor.Pulse(buf);
}

PS: Msdn将脉冲解释为

脉冲(信号),PulseAll

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-04 13:55:40

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

代码语言:javascript
复制
lock (buf)

当前线程被放置在"buf“的就绪队列的后面,并等待轮到它来获得锁。

我们必须假设您有其他线程使用buf,其中至少有一个线程被调用

代码语言:javascript
复制
Monitor.Wait(buf);

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

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

代码语言:javascript
复制
Monitor.Pulse(buf);

这意味着监视器接收等待队列前面的线程,并将其移动到就绪队列的后面。另一个线程,它被卡在等待队列中,现在排队等待buf上的锁。

在锁块的末尾,将自动调用Monitor.Exit,并且当前线程不再处于buf的就绪或等待队列中。

不可能在没有看到其余代码的情况下,说明为什么Monitor.Pulse调用在lock语句中是必要的。

编辑

下面是我对正在发生的事情的猜测:这可能是生产者/消费者队列模式的实现。

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

您要显示的代码是当生产者线程向buf添加项时。然后调用Monitor.Pulse( buf )唤醒其中一个使用者线程并将该使用者线程移动到就绪队列,等待对buf的锁定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15202828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档