gpt4 book ai didi

c# - 现在,为什么 Monitor 需要一个条件变量?

转载 作者:太空宇宙 更新时间:2023-11-03 15:53:56 25 4
gpt4 key购买 nike

当您查看 C# 的 Monitor 类(在 lock 关键字的幕后使用的类)时,您会发现在其实现中有一个条件变量,并且一个互斥体。互斥量由一个新线程进入获取,如果还没有被另一个线程获取,然后它继续检查条件变量,如果是true,线程可以继续,如果不是' t 为真,然后它被放入条件变量的线程 sleep 队列,以便在条件变量再次变为真时被唤醒。

现在,为什么 Monitor 需要一个条件变量?它检查什么条件?我已通读 wikipedia's关于 Monitor 的文章,我无法推断出它将等待什么条件?

它不是lockMonitor 的用户指定的东西,而是一些内部变量。看到 object 被锁作为参数,是 supposedly only for identifying锁。

这就像使用 AutoResetEventMutex 并获取 Mutex 上的锁,然后查看 AutoResetEvent 是否设置为发出信号?

我不确定我是否明白为什么 Monitor 需要一个条件变量,当一个线程等待获取互斥体时,它不会在互斥体被释放时也被唤醒吗? (操作系统调度程序可能会唤醒)

我希望这是有道理的,并且有人可以找到我理解中的差距。

最佳答案

这是 CLR 4.0 中引入的 Monitor.Enter 方法的重载,用于修复一个微妙的漏洞。

这在 this website 中有解释.

Monitor.Enter (_locker);
try
{
if (_val2 != 0) Console.WriteLine (_val1 / _val2);
_val2 = 0;
}
finally { Monitor.Exit (_locker); }

Consider the (unlikely) event of an exception being thrown within the implementation of Monitor.Enter, or between the call to Monitor.Enter and the try block (due, perhaps, to Abort being called on that thread — or an OutOfMemoryException being thrown). In such a scenario, the lock may or may not be taken. If the lock is taken, it won’t be released — because we’ll never enter the try/finally block. This will result in a leaked lock.

To avoid this danger, CLR 4.0’s designers added the following overload to Monitor.Enter

关于c# - 现在,为什么 Monitor 需要一个条件变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com