multithreading - 为什么在调用 Monitor.Wait( ) 之前必须获取监视器?

  显示原文与译文双语对照的内容
0 0

线程在它当前不拥有的锁对象上调用 Monitor.Wait(lockObj),则将引发一个 SyncronizationLockException

我不明白这一点? 如果线程确实拥有锁,因此可以成功调用 Monitor.Wait(),那么它就会立即释放锁。 为什么线程不能只等待它当前不拥有的锁?


更新

我已经决定给我的问题加一些解释。

我理解等待只是把当前线程放在监视器的等待队列中,并释放锁。 稍后,脉冲或者脉冲都将等待队列中的一个或者全部线程移动到就绪队列。 每当监视器被释放时,就绪队列上的下一个( 如果有的话) 线程就会得到锁。

那么为什么等待不能简单地将线程添加到等待队列? 为什么需要获取锁才能执行这里操作? 是否有物理原因,或者者微软设计了类来强制你使用正确的方法?

现在我想,我想我将某些东西放在监视队列的等待中,或者者移动到准备队列中。 如果你需要自己的显示器来做这个事情,那就有意义了。 这是正确的思考方式?

欠我的大脑多线程 !

时间:原作者:3个回答

0 0

Monitor.Wait的目的是让其他线程有机会抓住你的锁。

如果你首先不拥有锁,那么就没有必要了;它的他线程可以以抓住锁。
( 除非其他线程拥有锁,在这种情况下调用 Wait 会使线程混乱)

原作者:
0 0

Monitor.Wait 用于释放锁,然后以原子方式重新获取锁,以原子方式重新。 BCL中没有其他同步机制可以声明为 fame 。 显然,如果一个锁还不存在,Wait 无法重新获取它。 这就是引发异常的原因。

Wait 重新获取现有锁的事实是一个非常强大的机制。 这是行为中的一个基本唯一性,它允许它用于构建in中的所有它的他同步机制。

原作者:
0 0

在大多数情况下调用 Monitor.Wait 将在大多数情况下引入非确定性的Bug 。 如果在获取锁后调用 Monitor.Wait,而不在获取锁和调用 Monitor.Wait 之间设置任何共享变量,则同样。

特别是,如果你不拥有锁,那么你永远不能确保在输入 Monitor.Wait 之前没有执行附带的Monitor.Pulse 。 当操作系统在 Monitor.Wait 调用之前暂停线程时考虑一个情况,并在执行一些计算后继续执行 Monitor.Pulse 。 所有共享变量都相信线程B 正在等待,但这只是不是 true 。 线程A 在此时无法停止执行 Monitor.Wait

另外,你可能对信号量 http://en.wikipedia.org/wiki/Semaphore_(programming的想法感兴趣。 你可以等待并发出信号,而不需要获取它们。 这是因为他们在其中保持一个状态。 所以如果你先信号,等待将不会锁定。

原作者:
...