一些背景:我正在构建一个 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/