Ada*_*m A 6 c# multithreading locking
我仍然不确定这两个电话之间的差异.来自MSDN,
Monitor.Enter(Object) 获取指定对象的独占锁.
Monitor.Wait(Object) 释放对象的锁定并阻止当前线程,直到它重新获取锁定.
从那里我假设Monitor.Wait与Monitor.Enter相同,只是它在重新获取之前首先释放对象的锁定.
当前线程是否必须首先锁定?一个不同的线程如何强制释放对象的锁定?为什么同一个线程想要重新获取锁?
SynchronizationLockException:调用线程不拥有指定对象的锁.
换句话说: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?
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4915 次 |
| 最近记录: |