C# 监测脉冲法

C# 监测脉冲法,c#,C#,有谁能解释一下这段代码吗。一步一步的工作?据我所知,代码的关键部分被锁定,一次只能由一个线程访问 lock (buf) { buf.AddRange(ary); Monitor.Pulse(buf); } PS:Msdn将脉冲解释为 脉冲(信号),脉冲 向一个或多个等待线程发送信号。该信号通知等待的线程锁定对象的状态已更改,并且锁的所有者已准备好释放锁。等待线程被放置在对象的就绪队列中,以便它可能最终接收对象的锁。一旦线程拥有了锁,它就可以检查对象的新状态,看看是否达到了所需的

有谁能解释一下这段代码吗。一步一步的工作?据我所知,代码的关键部分被锁定,一次只能由一个线程访问

lock (buf)
{
    buf.AddRange(ary);
    Monitor.Pulse(buf);
}
PS:Msdn将脉冲解释为

脉冲(信号),脉冲


向一个或多个等待线程发送信号。该信号通知等待的线程锁定对象的状态已更改,并且锁的所有者已准备好释放锁。等待线程被放置在对象的就绪队列中,以便它可能最终接收对象的锁。一旦线程拥有了锁,它就可以检查对象的新状态,看看是否达到了所需的状态

监视器类为每个锁定对象维护两个队列:“就绪”队列和“等待”队列

当前线程被放置在“buf”就绪队列的后面,并等待轮到它获得锁

我们必须假设有其他线程使用buf,并且至少有一个线程被调用

Monitor.Wait(buf);
然后,监视器会将另一个线程放在buf的等待队列中,它被卡住了

现在,当当前线程获得锁时,执行将继续:

Monitor.Pulse(buf);
这会向监视器发出信号,使其在等待队列的前面获取线程,并将其移动到就绪队列的后面。另一个被困在等待队列中的线程现在排队等待buf上的锁

在锁块的末尾,会自动调用Monitor.Exit,并且当前线程不再位于buf的就绪或等待队列中

lock (buf)
如果看不到代码的其余部分,就无法说明为什么在lock语句中需要使用Monitor.Pulse调用

编辑

下面是我对正在发生的事情的猜测: 这可能是生产者/消费者队列模式的实现

当消费者线程查看buf并发现没有可供他们使用的项目时,他们会调用Monitor.Wait(buf)并坐在等待队列中,直到被告知有新项目要使用

您正在显示的代码是当生产者线程向buf添加项目时显示的。
然后它调用Monitor.Pulse(buf)来唤醒一个消费者线程,并将该消费者线程移动到就绪队列,等待轮到它锁定buf。

这是一个很好的例子,说明了为什么使用有用的变量名和注释代码是一种很好的编码实践。我已经编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。感谢您的有用输入!我的理解力因你的帮助而提高了