2011-12-20 171 views
12

我正在寻找一个在Delphi中实现的优先级队列,它可以在多线程环境中很好地工作。东西不是围绕一个单线程执行锁定包装(我已经有)更好Delphi的线程安全优先级队列?

理想的无锁的,或专为多线程插入/删除。

特殊性在于,在正常操作中,只有在顶级(最高优先级项目)发生更改时才会添加,删除和通知,而最高优先级项目的“弹出”操作应该非常少见。

将它用于监视/超时线程监视任务,在其他线程执行,这些任务预计正常终止的大部分时间,所以他们只会被添加/删除从队列中。超时线程本质上将等待下一个超时事件,因此在最高优先级事件发生变化时需要通知。

这些任务由脚本处理,可以在任何时候安全地终止。

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

编辑:在Martin James发表评论之后,另一个特性是相对较少的不同超时值,并且对于每个超时值,问题都变成了FIFO队列的问题。

+0

为什么“围绕单线程实现锁定包装”对于此任务来说不够好? – Pol 2011-12-20 08:34:55

+0

使基于锁的解决方案不合适的性能约束是什么? – 2011-12-20 08:35:25

+0

@Pol:这还不够好,因为我已经有了一个(正如帖子中所说的) – 2011-12-20 08:56:17

回答

0

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

的OmnithreadLibrary包含线程安全队列: http://code.google.com/p/omnithreadlibrary/

http://code.google.com/p/omnithreadlibrary/

+4

多个单优先级队列并不是真正的解决方案。所有'爆炸'行动都变得非常复杂。 (推动,OTOH,很简单。)在我的中期计划中,TODO表示“检查无锁优先队列的可能性”,但这种情况在未来几个月内不会发生。 – gabr 2011-12-20 12:01:45

1

Julian Bucknall(“德尔福的托姆斯:算法与数据结构”的作者)最近宣布的EZDSL德尔福XE版本的发布(一个德尔菲结构图书馆)在他的Blog

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

我不禁分享好消息,我的另一目的是让他在回答问题时贡献的电话。

+0

我一直使用我自己的个人移植EZDSL,如果我相信任何东西作为基础开始,它就是EZDSL。 – 2011-12-20 21:14:31