【问题标题】:Thread-safe priority queue线程安全的优先队列
【发布时间】:2014-04-07 12:11:23
【问题描述】:

我们的目标是创建支持优先任务的线程池。 所以我需要写一些数据结构来支持线程安全的优先级队列。 当然,我们可以写大锁并使用std::priority_queue。但这不是那么有效。

有一个想法来实现带有并发提取的二进制堆(每个元素都有自己的自旋锁,并且有一个全局 shared_mutex ,当我们改变堆大小时它是写锁定的,当我们堆化节点时是读锁定的,当我们交换时并比较我们锁定它们的自旋锁的节点),但是有很多潜在的死锁能力,我仍然不知道如何避免它们。

有没有什么好的数据结构可以更容易地实现线程安全?或者是否有任何我可以调查的已经实现的堆?

【问题讨论】:

    标签: multithreading thread-safety heap threadpool


    【解决方案1】:

    不要这么快就认为无锁优先级队列会比互斥锁快。如您所见,任何显着复杂性的无锁结构往往非常复杂,涉及大量原子操作。在现代处理器上,由于在多核 CPU 中保持内存视图一致的复杂性,这些原子操作变得相对慢得多。

    在这种情况下,如果围绕简单二进制堆的简单自旋锁并不比无锁堆实现快得多,无论争用级别如何,我都会大吃一惊。

    【讨论】:

    • 我不想让它无锁,而是让它更简单。也许有一些很好的方法可以让它阻塞,但细粒度
    • @DuXeN0N 连续的 pop-first 操作将争夺几乎相同的插槽集,无论锁有多细粒度都有效地序列化它们。选择是抓一把锁,还是抓几把。
    【解决方案2】:

    你真的应该只实现你能找到的最简单的东西,用锁保护它,然后在你的应用程序中测试它。除非您每秒敲击数千次,否则锁的开销几乎肯定与应用程序的性能无关。如果您的队列相对较小,则尤其如此。

    我的建议是从std::priority_queue 开始,在它周围加个锁,然后试一试。

    如果你真的认为你需要一个无锁并发优先级队列,请查看Concurrent mutable priority queue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      相关资源
      最近更新 更多