C++后台服务如何高效实现多个定时器任务
大部分云端的后台服务,经常会使用到定时器功能来检测一些状态值的变化,且当定时器较多时,就需要设计统一的定时器管理模块来维护所有的定时器资源。然而要设计性能良好的定时器和管理模块,是需要一定的经验和技巧的,所以,姑且在此炫技一回,分享一下定时器模块设计的方法,主要从数据结构的角度来考虑。
采用自下而上的层次来设计,首先将每个定时器作为一个定时器节点的数据结构,结构体如下所示:
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; //当对所有定时器进行循环检测时,从这里开始
}
其对外提供的接口有:
- 设置并启动定时器
- 检测所有定时器任务是否间隔时间已经达到,达到后,则调用timerObj多态继承的基类函数来执行定时任务。
写在最后:为了使整个定时管理模块能够运行起来,应该设置一个线程来周期性的检测所有定时任务时间是否到达,一般情况会每秒检测一下,同时会与epoll网络模型结合起来用。
C++后台服务如何高效实现多个定时器任务的更多相关文章
- golang 后台服务设计精要
原文地址 守护进程 传统的后台服务一般作为守护进程(daemon)运行.linux 上创建 daemon 的步骤一般如下: 创建子进程,父进程退出: 调用系统调用 setsid() 脱离控制终端: 调 ...
- iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法
问题描述: iPhone越狱了,之后在Cydia中安装Anywhere虚拟定位,但是打开app提示:后台服务未启动,请重新安装应用后使用. 程序无法正常使用... 解决方法: 打开Cydia-已安装, ...
- 带后台服务配置的tomcat使用
tomcat服务启动,将不需要手动启动startup.bat,避免cmd窗口的出现,因为隐藏到后台服务执行: 1,下载. 官网:http://tomcat.apache.org/download-70 ...
- Android 三级联动选择城市+后台服务加载数据库
技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...
- highchart访问一次后台服务返回多张图表数据
本文承接上一篇,我们制作动态图表的时候,往往需要的不止一张图表,如果每张图表都与服务接口做一次交互的话未免太过频繁,这无论对前后还是后台都是一种压力,本文介绍一种一次访问返回多组数据的方式来减少前台与 ...
- linux/windows下启用和停止VMware后台服务的脚本
linux/windows下启用和停止VMware后台服务的脚本 linux/windows下启用和停止VMware后台服务的脚本 linux平台 windows平台 本文由乌合之众 lym瞎编,欢迎 ...
- mongodb启动后台服务
将MongoDB部署在服务器机子上时mongodb的实例应为后台服务进行的方式运行,而非前台进程,否则远程会话一关闭mongodb也跟着关闭了.本文介绍mongodb后台服务进程开启和关闭的操作. 开 ...
- 【JavaService】部署Java jar为Windows后台服务
将Java jar文件部署为Windows后台服务有多种方法:Service Installer.Java service Wrapper.JavaService.exe等等.这里介绍下使用JavaS ...
- 答CsdnBlogger问-关于定时和后台服务问题
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 前段时间写了不少博客,在问答页面也陆续回答几十个问题,之后Csdn乙同学找到我,说要推荐我参加问答类 ...
随机推荐
- python3之编码
这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang"Shebang这个符号通常在Unix系统的脚本中第一行开头中写到,它指明了执行这个脚本文件 ...
- USB CDC & 可变形参
控制台的三种连接方式: 1.IP网络 2.USB 3.UART 一:介绍USB CDC方式: 1.控制台配置如下: 2.USB Product ID 可以是:0x0000/0x5300/0x0238 ...
- Linux评估 CPU使用情况
评价参数 1)CPU utilization:最直观最重要的就是CPU的使用率.如果长期超过80%,则表明CPU遇到了瓶颈:2)User time: 用户进程使用的CPU:该数值越高越好,表明越多的C ...
- 基于opencv+ffmpeg的镜头分割
镜头分割常常被用于视频智能剪辑.视频关键帧提取等场景. 本文给出一种解决镜头分割问题的思路,可分为两个步骤: 1.根据镜头分割算法对视频进行分割标记 核心在于镜头分割算法,这里简单描述一种算法思路:r ...
- Mysql数据库服务器配置文件/etc/my.cnf的详细配置
以下是 Mysql数 据库服务器配置文件 /etc/my.cnf的详细配置.应用场合是 InnoDB引擎, 4核 CPU, 32位SUSE. [client] port = 3306 ...
- hadoop 更改 tmp目录
配置hadoop临时目录--------------------- 1.配置[core-site.xml]文件 <configuration> <property> <n ...
- DAY11-MYSQL索引原理与慢查询优化
一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...
- Android实现智能提示的文本输入框AutoCompleteTextView
今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个.这里我用两种不同的写法来处理.当然,无论用哪一种写法,效果都是一样的. 我们先来看效果图. 要实现这种效果十分简单 ...
- 两种布局的ListVIew Adapter。例如微信对话界面
这个界面 实现的不是微信对话界面.实现的是,focus的状态下,变为放大的另一种布局 重点: 一.定义类型个数 private final int TYPE_COUNT = 2; privat ...
- 定位程序问题出现的原因工具-jstack
jstack还可以生成线程快照 如何使用jstack: 1.打开命令行,输入jstack 在任务管理器中就可看到对应进程id 2.在命令行中输入 jstack -l 进程id 这样就可得到进程中所有的 ...