multithreading - 线程安全的优先队列

标签 multithreading thread-safety heap threadpool

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

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

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

最佳答案

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

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

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

关于multithreading - 线程安全的优先队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22197701/

相关文章:

multithreading - 如何从函数返回 JoinHandle?

java - 如何确保hibernate提交了事务?

Java - 我的二进制堆实现有多好?

python - 在 python 中,我应该如何在元组列表上实现最小堆?

c++ - Thread c++ 防止值改变

multithreading - 测量多线程应用程序的带宽

c++ - 自动更新最大值

c - 检测线程安全链表中的死锁

java - 按顺序使用 REST API,多线程环境中每次调用之间至少间隔 100 毫秒。 (带 RestTemplate)

algorithm - 堆 - 对未知输入执行 DeleteMax 操作 - 实现