首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Monitor.Pulse与Monitor.PulseAll的区别

Monitor.Pulse与Monitor.PulseAll的区别
EN

Stack Overflow用户
提问于 2009-03-23 21:41:20
回答 2查看 10.1K关注 0票数 28

Monitor.PulseAll通知队列中所有等待的线程()。

Monitor.Pulse在等待队列中通知一个线程。(下一个等待线程)

只有下一个线程(一个线程)才能获得锁。那有什么区别呢?

我应该什么时候使用Pulse vs PulseAll

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-23 21:45:15

当您希望唤醒多个线程时,请使用PulseAll,因为它们等待的条件现在可能会满足多个线程。(等待几乎总是与条件相关--通常应该在while循环中测试该条件。)

当您只想唤醒一个线程时使用Pulse,因为实际上只有一个线程能够完成有用的工作。

给出两个类比:

想象一下你只有一台打印机。一次只能用一个人,所以如果你有很多人在等你,你会把他们都送去睡觉--但你只会在打印机空闲的时候叫醒一个人。这反映了Pulse的使用。

现在想象一下你开了一家商店。当你关门的时候,顾客们在商店外面等着。当你打开商店时,你不只是想唤醒一个顾客--他们现在都可以进来了。这反映了PulseAll的使用。

票数 46
EN

Stack Overflow用户

发布于 2009-03-23 22:00:50

Monitor有两个队列:等待队列和就绪队列。在没有WaitPulse的情况下,所有试图获取锁的线程都进入就绪队列。当锁可用时,就绪队列中的一个线程将获得它。

当线程获取锁,然后执行Wait时,该线程进入等待队列。它正在等待一个PulsePulseAll,并且将一直处于等待队列中,直到它接收到一个Pulse,即使就绪队列中的其他线程获取并释放了锁。

Pulse将一个线程从等待队列移动到就绪队列。PulseAll将所有线程从等待队列移动到就绪队列。

这里的关键是等待队列中的线程永远无法获得锁。他们正在等待一个脉冲将它们移回就绪队列,以便在锁可用时获得它。

关于“等待和脉冲”有一个相当好的讨论--至少有一点可以让你开始--这里

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

https://stackoverflow.com/questions/675352

复制
相关文章

相似问题

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