.net 当Monitor.Enter(obj)上的线程被阻塞时,它是否被放入obj';准备好排队了吗?

.net 当Monitor.Enter(obj)上的线程被阻塞时,它是否被放入obj';准备好排队了吗?,.net,multithreading,clr,.net,Multithreading,Clr,如果是这样,那就意味着被阻止的线程可以在另一个线程调用Monitor.Wait(obj)时进入。这对我来说似乎有点奇怪,因为它必须与就绪队列中的其他线程竞争 如果没有,它只能在调用Monitor.Exit(obj)时取消阻塞吗?还是在obj的等待队列中 MSDN库类文档中没有明确说明这一点。是的,当另一个线程调用监视器时,被阻止的线程可以进入。请稍候。为什么它不能呢 特别是,它必须能够-因为当前阻塞的线程可能是要调用Pulse的线程 考虑生产者/消费者队列: Producer

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

如果没有,它只能在调用
Monitor.Exit(obj)
时取消阻塞吗?还是在obj的等待队列中


MSDN库类文档中没有明确说明这一点。

是的,当另一个线程调用
监视器时,被阻止的线程可以进入。请稍候。为什么它不能呢

特别是,它必须能够-因为当前阻塞的线程可能是要调用
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

如果生产者线程仍在等待退出调用,则此场景将不起作用。

是的,当另一个线程调用
监视器时,被阻止的线程可以进入。等待。为什么它不能呢

特别是,它必须能够-因为当前阻塞的线程可能是要调用
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

如果生产者线程仍在等待退出调用,则此场景将不起作用。

我明白了,该示例基本上证明,如果您甚至要支持Wait/Pulse,那么在Enter上阻塞需要准备就绪,因为Wait/Pulse只能在进入和退出调用之间调用。但是,由于线程处理足够复杂,而且我没有访问源代码的权限,因此我还希望文档能够根据队列明确解释Enter。谢谢你的确认和解释。我明白了,这个例子基本上证明了,如果你要支持Wait/Pulse,那么在Enter上阻塞需要准备就绪,因为Wait/Pulse只能在进入和退出的调用之间调用。但是,由于线程处理足够复杂,而且我没有访问源代码的权限,因此我还希望文档能够根据队列明确解释Enter。感谢您的确认和解释。