C# 为什么MSDN上'lock'关键字的第二个示例可以与Monitor一起正常工作。等等?
在MSDN中的线程教程中, 在示例2中->下面是 我无法理解这个程序如何运行良好, 在ReadFromCell中有一个锁块,在该块中,他们正在使用Monitor.Wait-等待Monitor.Pulse在WriteToCell方法中,但对Monitor.Pulse的调用也在同一实例的锁块中,因此我们将如何进行此调用,有人可以解释 对不起,我的英语,我试图让它更具体,希望它更容易理解。 无论如何,我收到了问题的答案,谢谢。阅读以下文件: 释放对象上的锁并阻止当前线程,直到它重新获得锁。如果指定的超时间隔已过,线程将进入就绪队列 我不知道还有什么可以补充的。这正是代码工作的原因C# 为什么MSDN上'lock'关键字的第二个示例可以与Monitor一起正常工作。等等?,c#,C#,在MSDN中的线程教程中, 在示例2中->下面是 我无法理解这个程序如何运行良好, 在ReadFromCell中有一个锁块,在该块中,他们正在使用Monitor.Wait-等待Monitor.Pulse在WriteToCell方法中,但对Monitor.Pulse的调用也在同一实例的锁块中,因此我们将如何进行此调用,有人可以解释 对不起,我的英语,我试图让它更具体,希望它更容易理解。 无论如何,我收到了问题的答案,谢谢。阅读以下文件: 释放对象上的锁并阻止当前线程,直到它重新获得锁。如果指定的超
嗯。。一件(明显的)值得注意的事情(也许)是,当调用Monitor.Pulse时,锁将被重新获取,但它不会立即发生。由于锁已被释放,因此其他线程现在可能会持有它,因此在脉冲发出后,当前休眠线程将不得不等待,直到有人释放锁。我不记得在任何地方是否有好的解释;但从经验来看,这是大多数人在显示器方面存在问题的原因: 有两个队列与对象关联: 就绪队列:线程正在等待释放锁对象,以便获取它并运行。 等待队列:线程正在等待脉冲(或等待超时) 两个队列中的线程都没有锁,只有具有锁的线程才能调用
Wait
或Pulse
因此,“生命周期”是:
Monitor.Enter()
(或到达lock
块的开头):线程进入就绪队列并排队等待锁释放。它需要等待队列中的所有其他线程获得锁并释放它(或离开队列),然后才能获得锁并继续运行锁
块中运行的唯一线程Wait()
。它释放锁并加入等待队列。它现在必须等待“wait()”池中的所有其他线程被触发(或超时)Pulse
这会将原始线程移动到就绪队列的末尾Pulse
的线程释放锁。这允许就绪队列头部的线程获取它Wait()之后继续运行该命令
Monitor.Exit
(或到达lock
块的末尾)并释放锁其工作原理如文档中所述。如果你有一个特定的问题,可以问,但是“它是如何工作的”这个词太宽泛了。你到底不明白什么?Monitor.Wait释放锁,直到锁被脉冲触发。@Tom OP确实指定了他们不明白的内容,有什么问题?他从来没有说过他完全不明白的内容。我不打算逐行阅读一个有文档记录的示例,因为有人太懒了,甚至不愿意告诉我他不理解的内容。