当前位置: 首页 > news >正文

c++定时器的原理与实现

1. 定时器解决了什么问题?

在项目中,通常有诸如心跳机制、KEY到期机制等等,这种任务周期性执行或者延迟执行的场景。

所以 就需要定时器来实现这种周期任务或者延迟任务的执行。

2. 如何实现定时器?

要实现定时器首先需要进行2个抉择

  1. 用什么容器/数据结构 来存储延迟任务
  2. 用什么机制来等待任务到期

2.1 定时任务的存储结构

可以用最小堆、红黑树、时间轮来存储定时任务

如果用最小堆或者红黑树来存储定时任务的话,就直接用epoch time作为key,然后value就是定时任务。

最小堆

对应stl中的priority_queue容器,但是不支持重复key以及随机删除,一般用vector容器自己实现

  1. 插入任务:将任务放到数组的最末尾,然后进行上浮操作,堆大小++
  2. 弹出最近的任务:将根节点弹出,然后用末尾元素覆盖根节点元素,然后进行下沉操作,堆大小–
  3. 删除任务:如果想要支持删除最小堆中的任务,需要维护一个hashmap,记录任务id和数组下标的映射关系,找到下标后,用末尾元素覆盖下标对于元素,然后进行下沉并上浮操作,堆大小–

最小堆的优点:因为是数组,所以cache友好。

红黑树

对应stl中的map/multimap容器,一般用multimap,因为支持重复的key

红黑树的优点:支持任意节点删除,支持范围查询

红黑树的缺点:cache不友好,而且需要存储父子节点和颜色信息。

时间轮

模拟时间转盘,每一个槽位代表一个时间刻度(如1ms),插入任务时,根据当前时间计算出任务多少时间后会触发,直接将任务插入对应的槽位。

时间轮的优点:插入删除都是O(1)O(1)O(1)的复杂度,性能好。

时间轮的缺点:如果刻度太大会导致精度损失,如果刻度太小会导致占用太多内存,如果实现多层时间轮的话比较复杂。

2.2 等待定时任务到期的机制

因为定时任务其实也是一个事件,就需要和异步事件模型进行抽象统一,所以可以用以下的机制来等待任务到期。

  1. timerfd
  2. select/poll/epoll的超时参数
  3. iouring的io_uring_prep_timeout

等待流程是:

  1. 计算距离当前时间 和 最快的定时任务的时间 的差值diff
  2. 将diff填入上面几种机制的等待时间
  3. 事件触发或者等待时间结束,执行所有的过期任务
http://www.jsqmd.com/news/385139/

相关文章:

  • C# .NET 周刊|2026年1月3期
  • 天辛大师揶揄AI时代墙外香,丙午年全球心智大革命?
  • 细胞群体动力学仿真软件:NetLogo_(2).NetLogo基本操作
  • CHI 开发备忘 00 记 -- CHI spec 00 目录
  • 大模型技术是如何帮助产品经理工作的?产品经理进阶之道,非常详细收藏我这一篇就够了
  • 细胞群体动力学仿真软件:NetLogo_(1).NetLogo软件概述
  • 细胞群体动力学仿真软件:NetLogo_(1).NetLogo软件介绍
  • 管道疏通服务哪家强?2026年秦皇岛管道疏通推荐与排名,解决技术性与可靠性核心痛点 - 品牌推荐
  • 深入C++/C#参数传递:从内存布局到现代特性,彻底掌握值、引用、指针的底层机制与最佳实践
  • MemOS 构建 Agent 记忆图谱实战全攻略(非常详细),从 LangChain 进阶到精通,收藏这一篇就够了!
  • 2026年秦皇岛管道疏通推荐:专业服务趋势评测涵盖家庭与企业疏通场景 - 品牌推荐
  • Multi-Agent架构实战全攻略(非常详细),从核心范式到LangGraph精通,收藏这一篇就够了!
  • 深入剖析 C++ 与 C# 参数传递:从内存模型到编译器实现
  • MyBatis-Plus06:IService接口Lambda基本用法
  • 大模型应用发展全景解析(非常详细),RAG、MCP、Agent从入门到精通,收藏这一篇就够了!
  • pytest-django深度解析
  • 2026年青岛管道疏通推荐:市政与家庭服务趋势排名,涵盖高压清洗与修复技术痛点 - 品牌推荐
  • Memento:无需微调,AI智能体实战自我进化,小白也能轻松掌握大模型新范式!
  • 数据可视化制作方法详细介绍
  • LLM大模型产品经理终极学习指南:2026全新版,普通产品经理需要学习大模型,转大模型产品经理!
  • 小白程序员必看:DeepSeek V4 技术揭秘,算力不够算法来凑!
  • 2026年IEEE TASE SCI2区,基于熵引导局部规划的多无人机自适应协同探索方法,深度解析+性能实测
  • 2026年青岛管道疏通推荐:居家应急与市政维护场景深度评测,解决堵塞与异味核心痛点 - 品牌推荐
  • AI Agent构建(2) - 深入解析 A2A 协议与 Go 实战指南
  • [嵌入式系统-213]:电源的纹波
  • 从HBase到Cassandra:主流列式数据库技术对比
  • AI辅助编程工具(八) - Baidu Comate
  • 编写 MapReduce 程序清洗信件内容数据
  • Spring Boot Test深度解析
  • 怎么搭建OpenClaw?2026年天翼云搭建简易指南