delphi – TMonitor.Pulse vs TMonitor.PulseAll

delphi – TMonitor.Pulse vs TMonitor.PulseAll,第1张

概述Delphi Docwiki解释说, Pulse通知等待队列中的下一个线程,一旦调用线程释放对象,它就能锁定指定的对象. PulseAll发信号通知等待队列中的所有线程. I found此代码在线程队列实现中使用Pulse,并且根据上面的定义,认为应该使用PulseAll – 或者以不同的方式询问:何时使用Pulse而不是PulseAll是正确的? (基本问题在于:如何确保队列中的’下一个线程’是 Delphi Docwiki解释说,Pulse通知等待队列中的下一个线程,一旦调用线程释放对象,它就能锁定指定的对象. PulseAll发信号通知等待队列中的所有线程.

I found此代码在线程队列实现中使用pulse,并且根据上面的定义,认为应该使用pulseAll – 或者以不同的方式询问:何时使用pulse而不是pulseAll是正确的? (基本问题在于:如何确保队列中的’下一个线程’是需要通知的线程,除非在总共只有两个线程的简单情况下,或者代码可以安全假设唯一等待的线程是需要被nofifIEd /’pulsed’的线程?)?

function TSimpleThreadedQueue.Enqueue(const Item: T; Timeout: LongWord): TWaitResult;begin  if Closed then Exit(wrAbandoned);  if not TMonitor.Enter(FQueue,Timeout) then Exit(wrTimeout);  try    if Closed then Exit(wrAbandoned);    FQueue.Enqueue(Item);    TMonitor.pulse(FQueue);    Result := wrSignaled;  finally    TMonitor.Exit(FQueue);  end;end;

对于Java语言中的相应同步方法,我发现了这个问题:Java: notify() vs. notifyAll() all over again

更新:上面链接的Java问题有一个有趣的答案,它显示了即使在生成器/消费者应用程序中也会发生死锁,该应用程序只有两个方法,put和get,以及使用notify()(pulse()的Java副本) :Java: notify() vs. notifyAll() all over again

答案包含建议

If you are not sure which to use,then
use notifyAll.

解决方法 在传统的生产者/消费者队列中,每个消费者线程从队列中取出一个项目. 当您将单个项目排入队列时,您只需要唤醒单个消费者线程.由于任何消费者线程都可以处理任务,因此无论哪一个被唤醒都是无关紧要的.因此,调用pulse()而不是pulseAll()就足够了. 总结

以上是内存溢出为你收集整理的delphi – TMonitor.Pulse vs TMonitor.PulseAll全部内容,希望文章能够帮你解决delphi – TMonitor.Pulse vs TMonitor.PulseAll所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1271519.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存