【问题标题】:Thread-safe Priority Queue for Delphi?Delphi的线程安全优先级队列?
【发布时间】:2011-12-20 08:10:15
【问题描述】:

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

理想情况下是无锁的,或者专为多线程插入/删除而设计,比围绕单线程实现的锁定包装器(我已经拥有)更好。

具体的一点是,在正常的操作中,只有top(最高优先级的item)改变时才会有增删改查,而最高优先级item的“pop”操作应该是非常少的。

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

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

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

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

【问题讨论】:

  • 为什么“围绕单线程实现的锁定包装器”不足以完成这项任务?
  • 哪些性能限制导致基于锁的解决方案不适用?
  • 有时无锁解决方案当然会更糟。
  • 好的,一个建议 - 不要从列表中删除它们,只需在某些内部状态枚举中将它们标记为“待删除”。最终,超时线程将处理它们并删除它们。
  • @EricGrange - 添加项目时,它们总是添加相同的超时值,因此总是添加到队列的末尾,还是超时间隔变化很大?

标签: delphi thread-safety priority-queue


【解决方案1】:

Julian Bucknall(《Delphi 之书:算法和数据结构》的作者)最近在他的Blog 中宣布了EZDSL(一个Delphi 结构库)的Delphi XE 版本的发布。

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

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

【讨论】:

  • 我一直在使用我自己的个人移植 EZDSL,如果我相信任何可以作为基础的东西,那就是 EZDSL。
【解决方案2】:

我的框架架构完全围绕优先线程队列构建 - 这是我使用的唯一线程模型 (http://www.csinnovations.com/framework_overview.htm)。一个陡峭的学习曲线,但它可能会给你一些想法。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 多个单优先级队列并不是真正的解决方案。所有“弹出”操作都变得非常复杂。 (OTOH,推动很简单。)在我的中期计划中,TODO 说“检查无锁优先级队列的可能性”,但这不会在接下来的几个月内发生。
    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多