C++ 优先级队列 - 根据更新的优先级重新排序

标签 c++ multithreading asynchronous data-structures priority-queue

一些背景:我正在构建一个 C++ 线程管理器,它允许用户创建一个 AsyncJob 对象并分配执行优先级。我有一个 JobManager 单例类,它管理这些 AsyncJobs 的优先级队列,并在可用时将它们分配给一个线程。

问题:用户需要能够修改优先级 AFTER 创建。例如,基于某些运行时事件,可能需要比其他文件更紧急地加载文件。我面临的问题是,当调用 push()pop() 时,优先级队列仅对内部堆上的元素重新排序。据我所知,没有公开的接口(interface)允许根据不断变化的优先级请求重新排序。

我想做的是这样的:

  • 在我的 JobManager 类中创建一个 hashmap,它包含指向优先级队列中对象的指针
  • 用户可以通过其 key 访问请求的作业并通过 HashMap 更新优先级
  • 然后 JobManager 向优先级队列发出优先级已更改的信号
  • 优先队列在内部重新排序

解决此问题的最佳方法是什么?我应该期望制作自己的自定义优先级队列类吗?或者可能从 std::priority_queue 扩展?

谢谢!

最佳答案

一个选项可能是允许您的 AsyncJob 处于“已取消”状态,并且在每次修改优先级后,只需将新的(拷贝)AsyncJob 添加到您的 PQ,然后取消旧的。

与许多事情一样,我认为“最佳方式”是非常主观的,因为它取决于您的约束程度以及您如何量化“最佳”。就个人而言,我喜欢避免从标准库类型派生并尽可能重新发明容器结构。

关于C++ 优先级队列 - 根据更新的优先级重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24222382/

相关文章:

vb.net - 在主线程上使用句柄运行 Sub

linux - 检查 fork() 是否安全

c# - Console.WriteLine 如何影响异常堆栈

android - 如何保持发布版本的断言活跃

c++ - 来自嵌套列表的成员,如何调用外部数据

java - 如何使用java Thread.currentThread().interrupt()

c# - 重用异步套接字 : subsequent connect attempts fail

javascript - 如何在 javascript 中实现类似同步的行为?

c++ - 如何使用 C++ Boost odeint 库求解这个常微分方程

c++ - 理解 C++11 中的 `memory_order_acquire` 和 `memory_order_release`