博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++后台服务如何高效实现多个定时器任务
阅读量:6567 次
发布时间:2019-06-24

本文共 935 字,大约阅读时间需要 3 分钟。

大部分云端的后台服务,经常会使用到定时器功能来检测一些状态值的变化,且当定时器较多时,就需要设计统一的定时器管理模块来维护所有的定时器资源。然而要设计性能良好的定时器和管理模块,是需要一定的经验和技巧的,所以,姑且在此炫技一回,分享一下定时器模块设计的方法,主要从数据结构的角度来考虑。

采用自下而上的层次来设计,首先将每个定时器作为一个定时器节点的数据结构,结构体如下所示:

struct Node {    time_t start_time;  //上一次触发的时间,用于比较是否到点    int timerId; //定时器id,唯一标识    int timeVal; //间隔多少秒执行一次    int count;   //当前触发次数    int total;   //总的触发次数    bool type;    //是否无限循环    bool isUsed;   //是否被使用了    Timer* timerObj;  //执行定时任务的处理对象,其他使用到定时器的类需要以Timer作为基类    Node* next_node;    Node* prev_node;}

定时器节点管理模块如下所示:

class Manager {    Node* nodes;   //指向所有节点构成的数组的指针    int maxCount;  //最大时间节点的数目    int idleCount;  //空闲的时间节点数目    Node idleHead;  //空闲节点的第一个节点,当申请创建新时间节点时,从这里取    Node usedHead;  //当对所有定时器进行循环检测时,从这里开始}

其对外提供的接口有:

  1. 设置并启动定时器
  2. 检测所有定时器任务是否间隔时间已经达到,达到后,则调用timerObj多态继承的基类函数来执行定时任务。

写在最后:为了使整个定时管理模块能够运行起来,应该设置一个线程来周期性的检测所有定时任务时间是否到达,一般情况会每秒检测一下,同时会与epoll网络模型结合起来用。

转载于:https://www.cnblogs.com/share-ideas/p/10380512.html

你可能感兴趣的文章
ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)
查看>>
jquery IE中加载xml
查看>>
.Net remoting, Webservice,WCF,Socket区别
查看>>
SQL 必知必会·笔记<13>插入数据
查看>>
Windows 8.1 应用开发 – 触控操作
查看>>
常见排序算法分析
查看>>
《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市
查看>>
MySQL 5.6学习笔记(函数)
查看>>
Python 处理EXCEL的CSV文档分列求SUM
查看>>
Activity Window View的关系
查看>>
poj 1182 食物链 并查集的又一个用法
查看>>
(转)用javamail发送带附件的邮件
查看>>
联想笔记本如何关闭功能键,快捷键,如Fn+F1与F1切换
查看>>
蓝桥杯 算法训练 操作格子(线段树,点更新)
查看>>
泛型实现中没有正确lock引用类型的一个隐藏bug分析
查看>>
win7 64系统安装oracle客户端使用PL/SQL Developer工具
查看>>
silverlight中Combox绑定数据以及动态绑定默认选定项的用法
查看>>
浅谈算法和数据结构: 十 平衡查找树之B树
查看>>
【Algorithm】插入排序
查看>>
WCF寄宿到Windows Service
查看>>