1

任何人都可以对这段代码有所了解。一步一步的工作?我的理解是代码的关键部分被锁定为一次只能由单个线程访问。

lock (buf)
{
    buf.AddRange(ary);
    Monitor.Pulse(buf);
}

PS:Msdn 将脉冲解释为

脉冲(信号),PulseAll

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

4

1 回答 1

0

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

lock (buf)

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

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

Monitor.Wait(buf);

然后 Monitor 会将另一个线程放在 buf 的等待队列中,它被卡住了。

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

Monitor.Pulse(buf);

这向 Monitor 发出信号以获取 Waiting 队列前面的线程,并将其移动到 Ready 队列的后面。被卡在等待队列中的另一个线程现在排队等待锁定 buf。

在锁块结束时,Monitor.Exit 被自动调用,当前线程不再处于 buf 的 Ready 或 Waiting 队列中。

如果不查看其余代码,就不可能在 lock 语句中说明为什么需要 Monitor.Pulse 调用。

编辑

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

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

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

于 2013-03-04T13:55:40.330 回答