Monitor.PulseAll
通知队列中的所有等待线程。
Monitor.Pulse
在等待队列中通知线程。 (下一个等待线程)
只有下一个线程(一个线程)才能获得锁定。那有什么区别?
我应该何时使用Pulse
vs PulseAll
?
答案 0 :(得分:43)
当您想要唤醒多个线程时使用PulseAll
,因为现在可以为多个线程满足它们正在等待的条件。 (等待几乎总是与条件相关 - 您通常应该在while
循环中测试该条件。)
当你只想唤醒一个线程时使用Pulse
,因为只有一个线程实际上可以做有用的工作。
给出两个类比:
想象一下,你有一台打印机。只有一个人可以一次使用它,所以如果你有很多人在等待,你就把它们全部送去睡觉 - 但是当打印机空闲时你只会唤醒一个人。这反映了Pulse
的使用。
现在想象你经营一家商店。当您关闭时,客户会在商店外等候。当你开店时,你不仅要唤醒一个顾客 - 他们现在都可以进来。这反映了PulseAll
的使用。
答案 1 :(得分:33)
Monitor
有两个队列:等待队列和就绪队列。在没有Wait
和Pulse
的情况下,尝试获取锁的所有线程都进入就绪队列。当锁定可用时,就绪队列中的一个线程将获取它。
当线程获得锁定然后执行Wait
时,该线程进入等待队列。它正在等待Pulse
或PulseAll
,并且将保持在等待队列中,直到它收到Pulse
,即使来自就绪队列的其他线程获取并释放锁定。
Pulse
将一个线程从等待队列移动到就绪队列。 PulseAll
将所有线程从等待队列移动到就绪队列。
这里的关键是等待队列中的线程永远不会获得锁。他们正在等待脉冲将它们移回准备好的队列,这样他们就可以在锁定时获得锁定。
对Wait和Pulse有一个相当不错的讨论 - 至少有一点可以让你开始 - here。