我正在寻找在Delphi中实现的优先级队列,该队列在多线程环境中运行良好。
理想情况下无锁,或者设计用于多线程插入/删除,比单线程实现(我已经拥有)的锁定包装更好。
特殊情况是,在正常操作中,当顶部(最高优先级项)更改时,只会添加,删除和通知,而最高优先级项的“pop”操作应该非常罕见。
它将用于监视/超时线程监视任务,在其他线程中执行,这些任务预计在大多数时间内正常终止,因此它们只是从队列中添加/删除。超时线程基本上会等待下一个超时事件,因此在最高优先级事件发生变化时需要通知。
任务由脚本处理,可以随时安全终止。
如果有更好的算法而不是优先级队列,它们也可能是很好的答案!
编辑:在Martin James的评论之后,另一个特点是相对较少的不同超时值,并且对于每个超时值,问题变成FIFO队列的问题。
答案 0 :(得分:2)
Julian Bucknall(“Delphi的Tomes:算法和数据结构”一书的作者)最近在他的{{3}中宣布发布了EZDSL(Delphi Structures Library)的Delphi XE版本}。
不幸的是,TThreadsafePriorityQueue(在EZDSLPQu.PAS中实现)是基于锁的。
我无法分享好消息,我的另一个意图是呼吁他回答这个问题。
答案 1 :(得分:1)
我的框架体系结构完全围绕优先级线程队列构建 - 这是我使用的唯一线程模型(http://www.csinnovations.com/framework_overview.htm)。陡峭的学习曲线,但它可能会给你一些想法。
答案 2 :(得分:0)
您可以为每个优先级使用一个队列,而不是单个队列。
OmnithreadLibrary包含线程安全队列: http://code.google.com/p/omnithreadlibrary/