skynet源码分析(1)——定时器的实现

本文详细介绍了Skynet定时器的数据结构和工作原理,包括timer_node和timer_event的结构,以及如何添加定时事件和执行定时任务。核心是时间轮算法,通过不同时间级别的队列高效管理定时器,达到快速查找和插入的效果。时间轮算法虽然占用更多内存,但提供了O(1)的时间复杂度,提高了性能。

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

一.定时器的数据结构.

skynet定时器采用一个timer的数据结构来保存数据, 如下:

    struct timer {
   
    	struct link_list near[TIME_NEAR];    //离当前时间最近的事件队列,每次tick的时候从这个队列里面
    	struct link_list t[4][TIME_LEVEL];   //离当前时间较远的事件队列。
    	struct spinlock lock;                
    	uint32_t time;                       //表示每次tick的数量,tick一次 time+1
    	uint32_t starttime;                  //进程启动开始的系统时间
    	uint64_t current;                    //进程启动开始经过的了多少时间,单位
    	uint64_t current_point;              //进程当前系统时间:单位 1/100秒。
    };

二.看一下如何增加一个定时器事件。

    static void add_node(struct timer *T,struct timer_node *node) {
   
    	uint32_t time=node->expire;
    	uint32_t current_time=T->time;
    	
    	if ((time|TIME_NEAR_MASK)==(current_time|TIME_NEAR_MASK)) {
   
    		link(&T->near[time&TIME_NEAR_MASK],node);
    	} else {
   
    		int i;
    		uint32_t mask=TIME_NEAR << TIME_LEVEL_SHIFT;
    		for (i=0;i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值