You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于时间的动作高效存储方案咨询:带取消与重调度需求的实现疑问

定时系统事件调度方案咨询

假设有一个周期为T的定时系统,存在一组事件,单个事件可在k*T时刻触发(k为整数)。若事件未触发,需支持取消或重调度至更晚时间点。

现有两种实现方案

  1. 使用std::map<timer_key, Event>作为存储,其中timer_key是std::chrono::steady_clock::time_point与64位序列号的配对。此时可查看下一个事件是否已过期,若过期则触发并从map中移除。取消或重调度时,需移除事件或提取后重新插入,这要么需要二级map,要么需存储迭代器。
  2. 另一种方案是使用堆:若无需取消或重调度,这是标准解决方案,但优先级队列仅允许移除首个元素,无法直接适用。不过结合std::vector与std::push_heap、std::pop_heap,可将事件设为无操作(no-op)来实现取消,容器为std::vector<std::pair<timer_key, std::unique_ptr<Event>>>。这里使用std::unique_ptr是因为vector重新分配时需保留Event的地址,且需存储事件指针以便在触发移除的上下文中访问。

现有方案的痛点

  • 两者都需要引用容器内的元素
  • std::map会产生大量堆操作,内存局部性较差
  • 带失效机制的优先级队列会包含无效条目,需等到过期才释放空间

咨询问题

是否有其他可选方案来解决该问题?

补充疑问

我意识到若事件始终以固定延迟调度,timer_key值应始终为单调序列,此观点是否正确?


内容的提问来源于stack exchange,提问作者user877329

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:07:54