mjn*_*mjn 5 delphi pulse tmonitor
Delphi Docwiki解释说,Pulse通知等待队列中的下一个线程,一旦调用线程释放对象,它就能锁定指定的对象.PulseAll发信号通知等待队列中的所有线程.
我发现这个代码在线程队列实现中使用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;
Run Code Online (Sandbox Code Playgroud)
对于Java语言中的相应同步方法,我发现了这个问题:Java:notify()与notifyAll()一遍又一遍
更新:上面链接的Java问题有一个有趣的答案,它显示了即使在生成器/消费者应用程序中也会发生死锁,该应用程序只有两个方法,put和get,以及使用notify()(Pulse()的Java副本) :Java:再次通知()和notifyAll()
答案包含建议
如果您不确定使用哪个,请使用
notifyAll.
在传统的生产者/消费者队列中,每个消费者线程从队列中取出一项。当您对单个项目进行排队时,您只需要唤醒一个消费者线程。由于任何消费者线程都可以处理该任务,因此唤醒哪个消费者线程并不重要,只要唤醒一个即可。因此,调用Pulse()而不是PulseAll()足够了。
| 归档时间: |
|
| 查看次数: |
899 次 |
| 最近记录: |