【发布时间】:2023-10-16 02:23:01
【问题描述】:
一些背景知识:我正在构建一个C++
线程管理器,它允许用户创建一个AsyncJob
对象并分配执行优先级。我有一个 JobManager
单例类,它管理这些 AsyncJobs
的优先级队列,并在可用时将它们分配给线程。
问题:用户需要能够修改AFTER
创建的优先级。例如,基于一些运行时事件,文件可能需要比其他文件更紧急地加载。我面临的问题是优先级队列仅在调用push()
或pop()
时重新排序内部堆上的元素。据我所知,没有公开的界面允许人们根据不断变化的优先级请求重新排序。
我想做的是这样的:
- 在我的
JobManager
类中创建一个hashmap
,该类保存指向优先级队列中对象的指针 - 用户可以通过key访问请求的job,并通过hash map更新优先级
-
JobManager
然后向优先级队列发出信号,告知优先级已更改 - 优先级队列在内部重新排序
解决此问题的最佳方法是什么?我应该期望创建自己的自定义优先级队列类吗?或者可能从std::priority_queue
扩展?
谢谢!
【问题讨论】:
-
这些更改的频率如何?优先级可以上升和下降,或者只是上升,还是只是下降?我怀疑
std::priority_queue
会做你想做的事,但如果我对你的设置有更多了解,我可以尝试为你指出正确的方向。 -
变化很可能会上升;但是上下都是有效的。优先级更新不会那么频繁。
-
根据*.com/q/649640/56778,您对
std::priority_queue
不走运。您必须自己实现或找到一个可以做到的。 -
请参阅“如何在 STL priority_queue 中进行有效的优先级更新?” *.com/questions/649640/…
标签: c++ multithreading asynchronous data-structures priority-queue