我很高兴看到Delphi在Delphi 2009中引入了TMonitor记录,使您可以在多线程环境中锁定特定对象。使我感到困惑的是这种记录类型的Pulse和PulseAll方法。
例如,Delphi帮助中Pulse的条目状态为“通知调用线程释放对象后,等待队列中的下一个线程它将能够锁定指定对象”。
真?这意味着什么?我使用TMonitor时没有使用Pulse而不出现问题。另外,在Delphi的源代码中TMonitor的某些使用从未使用Pulse。
是仅在Delphi的TMonitor记录中包含Pulse和PulseAll方法,以便与.NET Monitor类实现源代码级的兼容性,还是它们真正起到了作用?
有两个问题("TMonitor.Pulse vs TMonitor.PulseAll"和"What is TMonitor in Delphi System unit good for")可以解决此问题,但是我正在寻找一个明确的答案。
最佳答案
我对所提问题的答案中的Wikipedia链接提供了有关监视器的等待/脉冲/脉冲全功能的使用的讨论。
线程必须进入监控器,他们调用等待。然后,另一个线程必须进入监视器并调用pulse或pulseall以向第一个等待线程发出信号。 Pulse仅表示一个等待线程,而pulseall表示所有等待线程。请查看Wikipedia文章的条件变量部分,以进行更详细的讨论。 RTL源代码中也有注释,描述了TMonitor的方法。