网狐的定时器引擎架构理解

该定时器引擎基于线程驱动 + 时间片轮询 + 队列事件分发 的核心思路实现,整体架构分为定时器管理定时线程驱动事件分发三个核心模块,以下是详细的实现流程和原理:

一、核心设计思路
  1. 时间片轮询:通过独立线程以固定时间间隔(默认 25ms)触发时间检查,避免高频系统调用,降低资源消耗;
  2. 定时器对象池:维护 "空闲 / 活跃" 定时器链表,复用定时器对象减少内存分配开销;
  3. 事件队列分发:定时器到期后不直接执行逻辑,而是将事件投递到队列服务,由业务层异步处理,解耦定时器核心与业务逻辑。

二、核心组件与依赖

组件 作用
CTimerThread 定时器驱动线程,以固定时间片睡眠后触发时间检查
CTimerEngine 定时器核心管理器,负责定时器的增删、时间计算、到期事件投递
CQueueServiceEvent 事件投递器,将到期的定时器事件投递到队列服务(IQueueService)
CQueueService 队列服务,接收定时器事件并异步分发给业务层的回调接口
三、完整实现流程
1. 初始化阶段(BeginService)
cpp 复制代码
// TimerEngine.cpp -> CTimerEngine::OnTimerThreadSink
void CTimerEngine::OnTimerThreadSink() {
    CThreadLockHandle LockHandle(&m_ThreadLock);
    // 1. 无活跃定时器则直接返回
    if (m_dwTimeLeave==NO_TIME_LEFT) return;
    // 2. 累计已过时间,更新剩余时间
    m_dwTimeLeave -= m_dwTimerSpace;
    m_dwTimePass += m_dwTimerSpace;
    // 3. 检查是否有定时器到期(m_dwTimeLeave==0表示到检查点)
    if (m_dwTimeLeave==0) {
        DWORD dwTimeLeave=NO_TIME_LEFT;
        for (INT_PTR i=0;i<m_TimerItemActive.GetCount();) {
            tagTimerItem* pTimerItem = m_TimerItemActive[i];
            // 计算当前定时器剩余时间
            pTimerItem->dwTimeLeave -= m_dwTimePass;
            // 4. 定时器到期
            if (pTimerItem->dwTimeLeave==0L) {
                // 投递定时器事件到队列服务
                m_AttemperEvent.PostTimerEvent(pTimerItem->wTimerID, pTimerItem->wBindParam);
                // 5. 处理重复次数
                if (pTimerItem->dwRepeatTimes != TIMER_REPEAT_TIMER) {
                    if (pTimerItem->dwRepeatTimes==1) {
                        // 单次定时器:移到空闲池
                        m_TimerItemActive.RemoveAt(i);
                        m_TimerItemFree.Add(pTimerItem);
                        bKillTimer=true;
                    } else {
                        // 多次定时器:减少次数,重置剩余时间
                        pTimerItem->dwRepeatTimes--;
                        pTimerItem->dwTimeLeave = pTimerItem->dwElapse;
                    }
                } else {
                    // 无限重复:重置剩余时间
                    pTimerItem->dwTimeLeave = pTimerItem->dwElapse;
                }
            }
            // 6. 更新全局最近到期时间
            if (!bKillTimer) {
                i++;
                dwTimeLeave=__min(dwTimeLeave, pTimerItem->dwTimeLeave);
            }
        }
        // 7. 重置时间累计,准备下一轮
        m_dwTimePass=0L;
        m_dwTimeLeave=dwTimeLeave;
    }
}

CTimerEngine::SetTimer → 初始化定时器 → CTimerThread(25ms轮询)→ OnTimerThreadSink(检查到期) → CQueueServiceEvent::PostTimerEvent → CQueueService::AddToQueue → 队列线程异步触发业务回调

总结:该定时器引擎是典型的 "时间片轮询 + 对象池 + 事件队列" 实现,兼顾了性能、线程安全和业务解耦,适合服务端高并发场景下的定时任务管理。

相关推荐
词元Max25 分钟前
1.5 Harness 架构深度解析:Claude Code 为什么强?
android·架构
Batac_蝠猫29 分钟前
Claude Code 源码架构与模块功能详解
架构·claude·源码泄露
AI创界者31 分钟前
基于 C++ 架构的高性能远程管理技术探究(附 V7.4 优化解析)
人工智能·架构
GOWIN革文品牌咨询33 分钟前
B2B品牌升级路径判断:架构型、结构型、表达型三类问题怎么分
架构·工业软件·b2b品牌设计·b2b全案策划
mrchen2461 小时前
XAI工程实现可能
架构
EDPJ2 小时前
从 Grounding DINO 到 DINO-X:开放集目标检测的架构演进与细节拆解
目标检测·计算机视觉·架构·图像分割·图像分类
全栈若城3 小时前
HarmonyOS6 半年磨一剑 - RcInput 组件清空、密码切换与图标交互机制
架构·交互·harmonyos6·三方库开发实战·rchoui·三方库开发
AI服务老曹3 小时前
GB28181 与 RTSP 深度解析:企业级 AI 视频中台的全协议接入架构
人工智能·架构·音视频
好家伙VCC3 小时前
**CQRS模式实战:用Go语言构建高并发读写分离架构**在现代分布式系统中,随着业务复杂度的提升和用户量的增长,传统的单数据库模型逐
java·数据库·python·架构·golang
Fang fan3 小时前
EasyLive评论架构升级
架构