定时器浅析

本文深入探讨了服务器中定时器的重要性和设计,包括基于升序链表、时间轮和时间堆的实现。Timer类包含cancel()、refresh()、reset()方法,而TimeManager负责管理定时器容器。文章分析了各种定时器结构的优缺点,如链表的快速插入删除、时间轮的高效散列以及时间堆的高效执行。
摘要由CSDN通过智能技术生成

定时器浅析

定时器是服务器中一个很重要的部件,比如定时对连接的进行健康检测,在设计协程的sleep API时也需要定时器的介入,因此有效地组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响。为此,定时器的设计值得我们去深入学习,本文将浅析定时器的设计及其在不同数据结构下的表现。

Timer

话不多说,直接上代码,从源码开始分析,这是我的一个服务器框架的定时器。

class TimeManager;			// 定时器管理器
class Timer : public std::enable_shared_from_this<Timer>{	// 定时器
friend class TimeManager;
public:
    using ptr = std::shared_ptr<Timer>;
    bool cancel();
    bool refresh();
    bool reset(uint64_t ms, bool from_now);
private:
    Timer(uint64_t ms, std::function<void()> cb, bool recurring, TimeManager* timeManager);
    Timer(uint64_t next);

private:
    uint64_t m_ms = 0;          			//执行周期
    uint64_t m_next = 0;        			//精确的执行时间
    std::function<void()> m_cb;   			//定时器回调
    bool m_recurring = false;   			//是否循环
    TimeManager* m_manager = nullptr;
private:
    struct Compare{
        bool operator()(const Timer::ptr& lhs, const Timer::ptr& rhs) const;
    };
};

定时器其实并不只指定时器,其实还包括定时器容器(TimeManager),定时器容器的设计正式定时器的精妙所在。

从上面的代码我们可以看到,定时器有五个私有变量,分别是:

  • m_ms: 定时器的执行周期
  • m_next: 定时器事件还有多久时间就会执行
  • m_cb: 定时器回调函数
  • m_manager: 定时器到达时间执行事件后是否继续定时

还有定义了私有类Compare是供TimeManager调用的,后文再说它的设计。

三个公有接口:

  • cancel(): 取消定时器事件
  • refresh(): 重新计算时间
  • reset(): 重新设置定时器的执行周期,可以选择是否重新计时

这里有一个细节,就是构造函数是私有的,切TimeManager被设置成友元类,所以Timer只能通过TimeManager创建

下面是公有接口的实现代码:

cancel()

bool Timer::cancel() {
    TimeManager::MutexType::Lock lock(m_manager->m_mutex);
    if(m_cb){
        auto it = m_manager->m_timers.find(shared_from_this());
        m_manager->m_timers.erase(it);
        return true;
    }
    return false;
}

m_manager->mutexTimeManager用来保护计时器容器的互斥量,保证线程安全。如果有回调函数的话,则从TimeManager的容器中删除掉本身。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值