Monitor.PulseAll
通知队列中所有等待的线程。Monitor.Pulse
在等待队列中通知线程。 (下一个等待线程)
只有下一个线程(一个线程)才能获取锁。那么区别是什么呢?
什么时候应该使用Pulse
和PulseAll
?
最佳答案
当您想唤醒多个线程时,请使用PulseAll
,因为它们等待的条件现在可以满足多个线程的需要。 (等待几乎总是与条件相关联-您通常应该在while
循环中测试该条件。)
当您只想唤醒一个线程时,请使用Pulse
,因为实际上只有一个线程能够执行有用的工作。
举两个类比:
想象一下,您有一台打印机。一次只有一个人可以使用它,因此,如果有很多人在等,则将他们全部送休眠眠状态,但是只有在打印机空闲时才能唤醒一个人。这反射(reflect)了Pulse
的使用。
现在,假设您经营一家商店。当您关门时,客户在商店外面等。当您开店时,您不仅要唤醒一位顾客,而且他们现在都可以进来。这反射(reflect)了PulseAll
的使用。