记录了 WebServer 中三种定时器的实现方案,代码参考: https://github.com/xzwsloser/linux_webserver_base

  1. 定时器其实是指定时器时间,也就是在WebServer中的三种事件之一(连接事件,IO事件,定时器事件),定时器事件需要利用特殊的容器管理,要求这些容器在规定的过期事件调用管理的某一个已经过期的定时器的回调函数完成相应的功能
  2. 基于升序链表的定时器: 把每一个定时器当成链表中的一个节点,并且按照过期事件的绝对值排列即可,心搏函数 tick 根据当前事件确定满足不过期条件的最后一个定时器并且执行前面的定时器的回调函数从而完成定时事件
  3. 时间轮算法: 类似于环形队列 + 散列表的数据结构,环形队列的每一个槽位放一个链表,每一次利用头插法插入元素到链表并且通过节点的 rotation属性来判断是否到了定时器执行的时间,通过调节槽位的数量可以调节定时精度
  4. 时间堆算法: 按照过期时间的绝对值构成小根堆,每一次添加定时器就可以把定时器插入到堆中,每一次心搏函数启动的时候就可以不断的取堆顶端的元素并且执行回调函数