Multithreading 线程安全优先级队列

Multithreading 线程安全优先级队列,multithreading,thread-safety,heap,threadpool,Multithreading,Thread Safety,Heap,Threadpool,有一个目标是建立线程池,它将支持具有优先级的任务。 所以我需要编写一些数据结构来支持线程安全优先级队列。 当然,我们可以编写大锁并使用std::priority\u队列。但这并不是很有效 有一个想法是通过并发提取实现二进制堆(每个元素都有自己的自旋锁,并且有一个全局共享的_互斥锁,当我们更改堆大小时,该互斥锁被写锁定,当我们对节点进行重分类时,该互斥锁被读锁定,当我们交换和比较节点时,我们锁定其自旋锁),但是有很多潜在的死锁能力,我仍然不知道如何避免它们 有没有什么好的数据结构可以更容易地实现线

有一个目标是建立线程池,它将支持具有优先级的任务。 所以我需要编写一些数据结构来支持线程安全优先级队列。 当然,我们可以编写大锁并使用std::priority\u队列。但这并不是很有效

有一个想法是通过并发提取实现二进制堆(每个元素都有自己的自旋锁,并且有一个全局共享的_互斥锁,当我们更改堆大小时,该互斥锁被写锁定,当我们对节点进行重分类时,该互斥锁被读锁定,当我们交换和比较节点时,我们锁定其自旋锁),但是有很多潜在的死锁能力,我仍然不知道如何避免它们


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

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


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

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

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


如果您真的认为需要无锁并发优先级队列,请查看。

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