【发布时间】:2014-08-24 10:45:50
【问题描述】:
当您查看 C# 的 Monitor 类(在 lock 关键字的内部使用的类)时,您会发现在其实现中您有一个条件变量和一个互斥体。互斥量被一个新进入的线程获取,如果没有被另一个线程获取,然后继续检查条件变量,如果是true,线程可以继续,如果不是,那么它被放入条件变量的线程睡眠队列,以便在条件变量再次变为真时被唤醒。
现在,为什么Monitor 需要条件变量?它检查什么条件?我已经阅读了关于 Monitor 的 wikipedia's 文章,但我无法推断它会等待什么条件?
它不是lock或Monitor的用户指定的东西,而是一些内部变量。看到object被锁作为参数,就是supposedly only for identifying锁。
这是否就像使用AutoResetEvent 和Mutex 并获得互斥锁上的锁,然后查看AutoResetEvent 是否设置为已发出信号?
我不知道为什么Monitor 需要一个条件变量,当一个线程等待获取一个互斥锁时,当互斥锁被释放时它不是也会被唤醒吗? (操作系统调度程序可能会唤醒)
我希望这是有道理的,并且希望有人能找到我理解中的差距。
【问题讨论】:
-
Monitor 根本不使用条件变量。也许假装它有一个可以了解它的工作方式是有帮助的。但是实现就大不一样了,不然buried inside the CLR.
标签: c# multithreading mutex monitor condition-variable