c++定时器的原理与实现
1. 定时器解决了什么问题在项目中通常有诸如心跳机制、KEY到期机制等等这种任务周期性执行或者延迟执行的场景。所以 就需要定时器来实现这种周期任务或者延迟任务的执行。2. 如何实现定时器要实现定时器首先需要进行2个抉择用什么容器/数据结构 来存储延迟任务用什么机制来等待任务到期2.1 定时任务的存储结构可以用最小堆、红黑树、时间轮来存储定时任务如果用最小堆或者红黑树来存储定时任务的话就直接用epoch time作为key然后value就是定时任务。最小堆对应stl中的priority_queue容器但是不支持重复key以及随机删除一般用vector容器自己实现插入任务将任务放到数组的最末尾然后进行上浮操作堆大小弹出最近的任务将根节点弹出然后用末尾元素覆盖根节点元素然后进行下沉操作堆大小–删除任务如果想要支持删除最小堆中的任务需要维护一个hashmap记录任务id和数组下标的映射关系找到下标后用末尾元素覆盖下标对于元素然后进行下沉并上浮操作堆大小–最小堆的优点因为是数组所以cache友好。红黑树对应stl中的map/multimap容器一般用multimap因为支持重复的key红黑树的优点支持任意节点删除支持范围查询红黑树的缺点cache不友好而且需要存储父子节点和颜色信息。时间轮模拟时间转盘每一个槽位代表一个时间刻度(如1ms)插入任务时根据当前时间计算出任务多少时间后会触发直接将任务插入对应的槽位。时间轮的优点插入删除都是O(1)O(1)O(1)的复杂度性能好。时间轮的缺点如果刻度太大会导致精度损失如果刻度太小会导致占用太多内存如果实现多层时间轮的话比较复杂。2.2 等待定时任务到期的机制因为定时任务其实也是一个事件就需要和异步事件模型进行抽象统一所以可以用以下的机制来等待任务到期。timerfdselect/poll/epoll的超时参数iouring的io_uring_prep_timeout等待流程是计算距离当前时间 和 最快的定时任务的时间 的差值diff将diff填入上面几种机制的等待时间事件触发或者等待时间结束执行所有的过期任务

相关新闻

MyBatis-Plus06:IService接口Lambda基本用法

MyBatis-Plus06:IService接口Lambda基本用法

一、LambdaQuery 复杂查询LambdaQuery 用法:构建复杂查询;若是简单的根据id的增删改查,还是建议用IService中的xxxById()这类传统方法。示例:一般做法:要加很多if条件判断,很繁琐。使用LambdaQuery方法&…

2026/7/5 21:25:10 阅读更多 →
LLM大模型产品经理终极学习指南:2026全新版,普通产品经理需要学习大模型,转大模型产品经理!

LLM大模型产品经理终极学习指南:2026全新版,普通产品经理需要学习大模型,转大模型产品经理!

前言 随着人工智能技术的蓬勃发展,尤其是大模型(Large Model)的强势兴起,越来越多的企业对这一领域愈发重视并加大投入。作为大模型产品经理,需具备一系列跨学科的知识与技能,方能有效地推动产品的开发、优…

2026/5/17 4:57:51 阅读更多 →
细胞群体动力学仿真软件:NetLogo_(1).NetLogo软件介绍与安装

细胞群体动力学仿真软件:NetLogo_(1).NetLogo软件介绍与安装

NetLogo软件介绍与安装 软件介绍 NetLogo 是一个可编程的多主体建模环境,主要用于模拟复杂系统中的个体行为及其相互作用。它是由美国西北大学的 Uri Wilensky 开发的,最初是为教育目的设计的,但因其强大的功能和易用性,也被广泛…

2026/7/4 23:05:12 阅读更多 →

最新新闻

Redis 主从复制,哨兵,集群——(2)哨兵篇

Redis 主从复制,哨兵,集群——(2)哨兵篇

目录 一. Redis 哨兵是什么? 二. Redis 哨兵有什么用? 三. Redis 哨兵数量配备要求 四. 哨兵配置文件详解 五. quorum 投票数详解 5.1 quorum 的含义 5.2 网络抖动导致主观下线 5.3 quorum 票数达到设定值客观下线 六. 最好让所有 redis 服务器…

2026/7/5 21:24:35 阅读更多 →
如何从huggingface快速下载

如何从huggingface快速下载

插播广告一条😂🐶:我制作的一个免费语音识别网站,欢迎体验! 方法一:使用Access Tokens # 安装准备 pip install huggingface-hub # 先登录,它会提示你输入你的 Hugging Face 访问令牌 (Access …

2026/7/5 21:24:35 阅读更多 →
从混乱到优雅:SQL Formatter如何让你的数据库查询代码焕然一新

从混乱到优雅:SQL Formatter如何让你的数据库查询代码焕然一新

从混乱到优雅:SQL Formatter如何让你的数据库查询代码焕然一新 【免费下载链接】sql-formatter A whitespace formatter for different query languages 项目地址: https://gitcode.com/gh_mirrors/sql/sql-formatter 你是否曾面对过同事提交的SQL代码&#…

2026/7/5 21:22:34 阅读更多 →
docker-flask-example数据库管理:使用Flask-DB进行迁移与种子数据操作

docker-flask-example数据库管理:使用Flask-DB进行迁移与种子数据操作

docker-flask-example数据库管理:使用Flask-DB进行迁移与种子数据操作 【免费下载链接】docker-flask-example A production ready example Flask app thats using Docker and Docker Compose. 项目地址: https://gitcode.com/gh_mirrors/do/docker-flask-example…

2026/7/5 21:22:34 阅读更多 →
如何在游戏机上安装B站客户端?wiliwili让你的Switch变身全能追番神器

如何在游戏机上安装B站客户端?wiliwili让你的Switch变身全能追番神器

如何在游戏机上安装B站客户端?wiliwili让你的Switch变身全能追番神器 【免费下载链接】wiliwili 第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili …

2026/7/5 21:22:34 阅读更多 →
C语言指针:指针类型、void*指针、const修饰及传址调用

C语言指针:指针类型、void*指针、const修饰及传址调用

文章目录一、指针类型的意义1. 指针的解引用2.指针的运算(1) 指针-整数(2) 指针-指针(3) 指针的关系运算二、void*类型的指针三、const修饰的指针1.const修饰变量2.const修饰指针变量四、指针在函数中的使用1.函数的传值调用2.函数的传址调用一、指针类型的意义 ● 既然指针变…

2026/7/5 21:20:34 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻