如果是这样,那就意味着当另一个线程调用Monitor.Wait(obj)
时阻塞的线程可以进入。这对我来说有点奇怪,因为它必须与就绪队列中的其他线程竞争。
如果没有,是否只能在调用Monitor.Exit(obj)
时取消阻止?或者是在obj的等待队列中?
这在MSDN Library类文档中没有明确记录。
答案 0 :(得分:1)
是的,当另一个线程调用Monitor.Wait
时,阻塞的线程可以进入。为什么它不能?
特别是 能够 - 因为当前阻止的线程可能是要调用Pulse
的线程。
考虑生产者/消费者队列:
Producer Consumer
Enter lock
Enter lock (block)
Check: queue is empty
Wait (block)
Unblocked
Add item to queue
Pulse
Exit lock
Unblocked (enters lock again)
Check: queue is now not empty
Fetch item
Exit lock
如果生产者线程仍在等待Exit调用,则此方案无效。