Monitor.PulseAll通知队列中所有等待的线程()。
Monitor.Pulse在等待队列中通知一个线程。(下一个等待线程)
只有下一个线程(一个线程)才能获得锁。那有什么区别呢?
我应该什么时候使用Pulse vs PulseAll
发布于 2009-03-23 21:45:15
当您希望唤醒多个线程时,请使用PulseAll,因为它们等待的条件现在可能会满足多个线程。(等待几乎总是与条件相关--通常应该在while循环中测试该条件。)
当您只想唤醒一个线程时使用Pulse,因为实际上只有一个线程能够完成有用的工作。
给出两个类比:
想象一下你只有一台打印机。一次只能用一个人,所以如果你有很多人在等你,你会把他们都送去睡觉--但你只会在打印机空闲的时候叫醒一个人。这反映了Pulse的使用。
现在想象一下你开了一家商店。当你关门的时候,顾客们在商店外面等着。当你打开商店时,你不只是想唤醒一个顾客--他们现在都可以进来了。这反映了PulseAll的使用。
发布于 2009-03-23 22:00:50
Monitor有两个队列:等待队列和就绪队列。在没有Wait和Pulse的情况下,所有试图获取锁的线程都进入就绪队列。当锁可用时,就绪队列中的一个线程将获得它。
当线程获取锁,然后执行Wait时,该线程进入等待队列。它正在等待一个Pulse或PulseAll,并且将一直处于等待队列中,直到它接收到一个Pulse,即使就绪队列中的其他线程获取并释放了锁。
Pulse将一个线程从等待队列移动到就绪队列。PulseAll将所有线程从等待队列移动到就绪队列。
这里的关键是等待队列中的线程永远无法获得锁。他们正在等待一个脉冲将它们移回就绪队列,以便在锁可用时获得它。
关于“等待和脉冲”有一个相当好的讨论--至少有一点可以让你开始--这里。
https://stackoverflow.com/questions/675352
复制相似问题