我仍然不确定这两个调用之间的区别。来自 MSDN,
Monitor.Enter(Object)
获取指定对象的独占锁。
Monitor.Wait(Object)
释放对象上的锁并阻塞当前线程,直到它重新获取锁。
据此,我假设 Monitor.Wait 与 Monitor.Enter 相同,除了它在重新获取之前先释放对象上的锁。
当前线程是否必须首先拥有锁?不同的线程如何强制释放对象的锁?为什么同一个线程要重新获取锁?
最佳答案
根据 MSDN: Monitor.Wait Method(Object)
SynchronizationLockException: The calling thread does not own the lock for the specified object.
换句话说:当您已经拥有锁时,您只能调用Monitor.Wait(Object)
,而您调用Monitor.Enter(Object )
以获取锁。
至于为什么需要 Monitor.Wait
:如果您的线程意识到它缺少继续执行的信息(例如它正在等待信号),您可能想让其他线程进入临界区,因为并非所有线程都具有相同的先决条件。
要让等待线程继续执行,您需要调用 Monitor.Pulse(Object)
或 Monitor.PulseAll(Object)
之前 释放锁(否则,您将得到与 Monitor.Wait(Object)
相同类型的异常)。
请记住,下一个在脉冲后和锁被释放后获取锁的线程不一定是接收到脉冲的线程。
另请记住,收到脉搏并不等同于满足您的条件。您可能还需要再等一会儿:
// make sure to synchronize this correctly ;)
while (ConditionNotMet)
{
Monitor.Wait(mutex);
if (ConditionNotMet) // We woke up, but our condition is still not met
Monitor.Pulse(mutex); // Perhaps another waiting thread wants to wake up?
}
关于c# - Monitor.Enter 与 Monitor.Wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16942538/