当一个线程在Monitor.Enter(obj)上被阻塞时,它是否被放入obj的就绪队列中?

时间:2009-12-03 09:24:43

标签: .net multithreading clr

如果是这样,那就意味着当另一个线程调用Monitor.Wait(obj)时阻塞的线程可以进入。这对我来说有点奇怪,因为它必须与就绪队列中的其他线程竞争。

如果没有,是否只能在调用Monitor.Exit(obj)时取消阻止?或者是在obj的等待队列中?

这在MSDN Library类文档中没有明确记录。

1 个答案:

答案 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调用,则此方案无效。