Monitor.Pulse和Monitor.PulseAll之间的区别

时间:2009-03-23 21:41:20

标签: c# .net multithreading

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

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

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

我应该何时使用Pulse vs PulseAll

2 个答案:

答案 0 :(得分:43)

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

当你只想唤醒一个线程时使用Pulse,因为只有一个线程实际上可以做有用的工作。

给出两个类比:

想象一下,你有一台打印机。只有一个人可以一次使用它,所以如果你有很多人在等待,你就把它们全部送去睡觉 - 但是当打印机空闲时你只会唤醒一个人。这反映了Pulse的使用。

现在想象你经营一家商店。当您关闭时,客户会在商店外等候。当你开店时,你不仅要唤醒一个顾客 - 他们现在都可以进来。这反映了PulseAll的使用。

答案 1 :(得分:33)

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

当线程获得锁定然后执行Wait时,该线程进入等待队列。它正在等待PulsePulseAll,并且将保持在等待队列中,直到它收到Pulse,即使来自就绪队列的其他线程获取并释放锁定。

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

这里的关键是等待队列中的线程永远不会获得锁。他们正在等待脉冲将它们移回准备好的队列,这样他们就可以在锁定时获得锁定。

对Wait和Pulse有一个相当不错的讨论 - 至少有一点可以让你开始 - here