Mic*_*ndl 27 .net c# multithreading
Monitor.PulseAll
通知队列中的所有等待线程.
Monitor.Pulse
通知等待队列中的线程.(下一个等待线程)
只有下一个线程(一个线程)才能获得锁定.那么区别是什么呢?
我何时应该使用Pulse
vs PulseAll
?
Jon*_*eet 44
使用PulseAll
时,你要唤醒多个线程,因为他们正在等待条件现在可以实现对多个线程.(等待几乎总是与条件相关 - 您通常应该在while
循环中测试该条件.)
使用Pulse
时,你只需要唤醒一个线程,因为只有一个线程实际上能够做无用功.
给出两个类比:
想象一下,你有一台打印机.一次只有一个人可以使用它,所以如果你有很多人在等待,你就把它们全部送去睡觉了 - 但是当打印机空闲时你只会唤醒一个人.这反映了使用Pulse
.
现在想象你经营一家商店.当您关闭时,客户会在商店外等候.当你开店时,你不仅要唤醒一个顾客 - 他们现在都可以进来.这反映了使用PulseAll
.
Jim*_*hel 36
A Monitor
有两个队列:等待队列和就绪队列.在没有Wait
和的情况下Pulse
,尝试获取锁的所有线程都进入就绪队列.当锁定可用时,就绪队列中的一个线程将获取它.
当一个线程获得锁定然后执行a时Wait
,该线程进入等待队列.它正在等待一个Pulse
或PulseAll
,并且将保持在等待队列中,直到它收到一个Pulse
,即使来自就绪队列的其他线程获取并释放锁定.
Pulse
将一个线程从等待队列移动到就绪队列. PulseAll
将所有线程从等待队列移动到就绪队列.
这里的关键是等待队列中的线程永远不能获取锁.他们正在等待一个脉冲将它们移回就绪队列,这样他们就可以获得锁定.
对Wait和Pulse有一个相当不错的讨论 - 至少有一点让你开始 - 在这里.
归档时间: |
|
查看次数: |
8693 次 |
最近记录: |