【发布时间】:2011-12-20 08:10:15
【问题描述】:
我正在寻找一个在 Delphi 中实现的优先级队列,它可以在多线程环境中很好地工作。
理想情况下是无锁的,或者专为多线程插入/删除而设计,比围绕单线程实现的锁定包装器(我已经拥有)更好。
具体的一点是,在正常的操作中,只有top(最高优先级的item)改变时才会有增删改查,而最高优先级item的“pop”操作应该是非常少的。
它将用于监视/超时线程监视任务,在其他线程中执行,这些任务预计大部分时间都会正常终止,因此它们只会从队列中添加/删除。超时线程本质上会等待下一个超时事件,因此当最高优先级事件发生变化时需要通知。
任务由脚本处理,可以随时安全终止。
如果有比优先队列更好的算法,它们也可能是很好的答案!
编辑:在Martin James的评论之后,另一个特殊性是不同的超时值相对较少,并且对于每个超时值,问题都变成了FIFO队列的问题。
【问题讨论】:
-
为什么“围绕单线程实现的锁定包装器”不足以完成这项任务?
-
哪些性能限制导致基于锁的解决方案不适用?
-
有时无锁解决方案当然会更糟。
-
好的,一个建议 - 不要从列表中删除它们,只需在某些内部状态枚举中将它们标记为“待删除”。最终,超时线程将处理它们并删除它们。
-
@EricGrange - 添加项目时,它们总是添加相同的超时值,因此总是添加到队列的末尾,还是超时间隔变化很大?
标签: delphi thread-safety priority-queue