Delphi的线程安全优先级队列?

Delphi的线程安全优先级队列?,delphi,thread-safety,priority-queue,Delphi,Thread Safety,Priority Queue,我正在寻找一个在Delphi中实现的优先级队列,它可以在多线程环境中很好地工作 理想情况下是无锁的,或者设计用于多线程插入/删除,其性能优于围绕单线程实现(我已经有了)的锁定包装器 其特殊性在于,在正常操作中,当最高优先级项目发生更改时,只会添加、删除和通知,而最高优先级项目的“pop”操作应该非常罕见 它将用于看门狗/超时线程监控任务,在其他线程中执行,这些任务通常在大多数时间终止,因此它们将被添加/从队列中删除。超时线程本质上是在等待下一个超时事件,因此当最高优先级事件发生变化时需要通知 任

我正在寻找一个在Delphi中实现的优先级队列,它可以在多线程环境中很好地工作

理想情况下是无锁的,或者设计用于多线程插入/删除,其性能优于围绕单线程实现(我已经有了)的锁定包装器

其特殊性在于,在正常操作中,当最高优先级项目发生更改时,只会添加、删除和通知,而最高优先级项目的“pop”操作应该非常罕见

它将用于看门狗/超时线程监控任务,在其他线程中执行,这些任务通常在大多数时间终止,因此它们将被添加/从队列中删除。超时线程本质上是在等待下一个超时事件,因此当最高优先级事件发生变化时需要通知

任务由脚本处理,脚本可以随时安全终止

如果有比优先级队列更好的算法,它们也可能是很好的答案


编辑:继Martin James的一句话之后,另一个特点是,不同的超时值相对较少,对于每个超时值,问题变成了FIFO队列。

每个优先级可以使用一个队列,而不是单个队列

OmnithreadLibrary包含线程安全队列:

(《德尔福大部头:算法和数据结构》一书的作者)最近在他的博客中宣布发布了(德尔福结构库)的德尔福XE版本

不幸的是,TThreadsafePriorityQueue(在EZDSLPQu.PAS中实现)是基于锁的


我忍不住要分享这个好消息,我的另一个意图是呼吁他在回答这个问题时做出贡献。

我的框架体系结构完全是围绕优先级线程队列构建的-这是我使用的唯一线程模型()。一个陡峭的学习曲线,但它可能会给你一些想法。

为什么“围绕单线程实现的锁定包装器”不足以完成此任务?是什么性能限制使得基于锁的解决方案不合适?有时无锁解决方案当然会更糟。好的,一个建议-不要从列表中删除它们,只需在某些内部状态枚举中将它们标记为“删除挂起”。最终,超时线程将获取这些项,然后可以删除它们。@EricGrange-添加项时,它们是否总是以相同的超时值添加,因此总是添加到队列的末尾,或者超时间隔是否变化很大?多个单优先级队列并不是真正的解决方案。所有的“弹出”操作都变得非常复杂。(推,OTOH,很简单。)在我的中期计划中,有一句话是“检查无锁优先级队列的可能性”,但这在未来几个月内不会发生。我从永远以来都在使用我自己的个人端口EZDSL,如果我相信任何东西作为基础,那就是EZDSL。