代码之家  ›  专栏  ›  技术社区  ›  Michael Piendl

Monitor.Pulse和Monitor.PULSELL之间的差异

  •  26
  • Michael Piendl  · 技术社区  · 17 年前

    Monitor.PulseAll 通知 在队列中。

    Monitor.Pulse 通知 线 在等候的队伍中。(下一个等待线程)

    我应该什么时候使用 Pulse vs PulseAll ?

    2 回复  |  直到 15 年前
        1
  •  44
  •   Jon Skeet    17 年前

    使用 PulseAll 当您想唤醒多个线程时,因为它们等待的条件现在可能会满足多个线程。(等待几乎总是与某个条件相关——您通常应该在一个测试环境中测试该条件 while 循环。)

    Pulse 当您只想唤醒一个线程时,因为实际上只有一个线程能够做有用的工作。

    假设你只有一台打印机。一次只能有一个人使用,所以如果有很多人在等你,你可以让他们都睡觉,但是当打印机空闲时,你只能叫醒一个人。这反映了 脉搏 .

    现在想象你经营一家商店。当你关门时,顾客在店外等候。当你开店时,你不只是想叫醒一位顾客,他们现在都可以进来了。这反映了 .

        2
  •  37
  •   Jim Mischel    17 年前

    A. Monitor 有两个队列:等待队列和准备队列。在没有 Wait 和 Pulse ,所有尝试获取锁的线程进入就绪队列。当锁可用时,就绪队列中的一个线程将获取它。

    当线程获取锁,然后执行 ,该线程进入等待队列。它在等待一个新的开始 脉搏 或 PulseAll ,并将保留在等待队列中,直到收到 脉搏 ,即使就绪队列中的其他线程获取并释放锁。

    脉搏 普希尔 将所有线程从等待队列移动到就绪队列。

    这里的关键是等待队列中的线程永远无法获得锁。他们正在等待一个脉冲将他们移回就绪队列,以便在可用时获得锁。

    关于等待和脉搏有一个相当好的讨论——至少有一点让你开始-- here .