C++实现的简单的定时器

本文探讨了定时器在保持连接活跃(keep alive)和游戏中指定时间操作等场景的应用,并介绍了一个基于最小堆实现的简单C++定时器,包括其工作原理和一个实际示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

已经好几天没有写博客了。
这几天都在看定时器,想搞清楚他的原理,想知道他到底是怎么用的。无奈没有一篇能够比较系统地告诉我定时器是干什么的,怎么用的,导致项目长时间停滞。
在看了几篇博客之后,根据我自己的理解,实现了一个简单的定时器,其中有参考其他的博文的写法,好在我现在实现了一个看起来能用的定时器。

定时器的应用场景

场景一:keep alive保活机制

成千上万个客户端去连接一台聊天服务器,那么就会存在成千上万个tcp连接。但是这些tcp连接是每时每刻都保持发包收包的活跃状态吗?不是!

某些tcp连接上,可能建立之后,在一天之内就没再发包/收包过,为了把有限的系统资源分配给更活跃的用户使用,我们应该设计一种方案来踢掉空闲连接。

场景二:游戏中,指定时间(或间隔时间)执行某种特定操作

  • 每日/每周/每月,特定时间执行一次操作

  • 循环执行的定时器,比如每隔一分钟刷新一次野怪

  • 只执行一次的定时器,在60秒后定时器超期,执行操作A

各种定时器性能比较

实现方式 StartTimer StopTimer PerTickBookkeeping
基于排序的链表 O(n) O(1) O(1)
基于最小堆 O(logn) O(1) O(1)
基于时间轮 O(1) O(1) O(1)

具体实现

这里采用了最小堆实现
Timer_mng.h

#ifndef __TIMER_MNG_
#define __TIMER_MNG_

#define ull unsigned long long 
#define __INF__ 1e18

using namespace std;

enum t_type {
   
   ONCE,CIRCLE};

class Timer_mng;
class Timer;

struct Heap_entry{
   
   		//堆条目
	unsigned long long time;
	Timer *timer;
};
struct Timer{
   
   
	t_type ttype;		//任务类型,一次还是循环
	void *(*run)(void *args);	//回调函数
	void *arg;					//会调函数参数
	ull itvl;					//时间片长度(ms)
	ull expires;				//到期时间
	int heapIndex;				//在堆中的下标
	Timer();					//初始化
	void Start(void *(*run)(void *args),void *arg,ull itvl, t_type ttype);
	void OnTimer();				//无剩余时间		
};
struct Timer_mng{
   
   
	vector<Heap_entry*>heap;		//堆
	~Timer_mng();					//析构函数
	void DetectTimers();			//检测是否超时
	void AddTimer(Timer* timer);	//向堆中添加一个定时器
	void RemoveTimer(Timer* timer);	//移除定时器
	void UpHeap(int idx);			//堆操作,向上更新
	void DownHeap(int idx);			//堆操作,向下更新
	void SwapHeap(int idx1, int idx2);	//更换堆中的两个元素
};

ull Get_now();			//得到当前时间(ms)

#endif

Timer_mng.cpp

#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值