Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么MSDN上'lock'关键字的第二个示例可以与Monitor一起正常工作。等等?_C# - Fatal编程技术网

C# 为什么MSDN上'lock'关键字的第二个示例可以与Monitor一起正常工作。等等?

C# 为什么MSDN上'lock'关键字的第二个示例可以与Monitor一起正常工作。等等?,c#,C#,在MSDN中的线程教程中, 在示例2中->下面是 我无法理解这个程序如何运行良好, 在ReadFromCell中有一个锁块,在该块中,他们正在使用Monitor.Wait-等待Monitor.Pulse在WriteToCell方法中,但对Monitor.Pulse的调用也在同一实例的锁块中,因此我们将如何进行此调用,有人可以解释 对不起,我的英语,我试图让它更具体,希望它更容易理解。 无论如何,我收到了问题的答案,谢谢。阅读以下文件: 释放对象上的锁并阻止当前线程,直到它重新获得锁。如果指定的超

在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确实指定了他们不明白的内容,有什么问题?他从来没有说过他完全不明白的内容。我不打算逐行阅读一个有文档记录的示例,因为有人太懒了,甚至不愿意告诉我他不理解的内容。