c# - Monitor.Enter 与 Monitor.Wait

标签 c# multithreading locking

我仍然不确定这两个调用之间的区别。来自 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/

相关文章:

c# - 无法在 C# 的通用约束中使用结构类型

c# - 复制PHP的动态多维数组创建

c# - 如何将配置文件中的方法名称添加到委托(delegate)中?

c# - 使用 StreamWriter 写入 MemoryStream 返回空

c++ - htop 和 OpenMP 线程

python - 锁定或解锁条件格式单元格 xlsxwriter

sql - 在存储过程中更新后选择

Java 将显式锁与同步方法结合起来

c - Libcurl 在 C 中具有摘要授权 : send http requests periodically

linux - 一个进程具有相同的 virt 和 res