时间轮是Linux中实现定时器的巧妙方式,也可以自己实现用于工程
可以参考http://www.ibm.com/developerworks/cn/linux/1308_liuming_linuxtime3/
和linux高性能服务器端编程的11.4.1
主要思想是构造一个轮->可以用循环列表实现,
插入:
新来一个定时事件,姑且视作包含定时时长和回调函数的类实例,算出还要转多少圈又多少step才转到,记录进实例
ticks = timeout / step
int pos = ( cur_slot + ( ticks % N ) ) % N
得到pos,即插入的位置(列表下标),ucr_slot为当前work的时间槽,step为时间轮的step,N为列表长度
把实例插入pos所在槽,每个槽对应一个链表
处理:
每次处理当前槽,遍历链表,检查时间是否超时,超时的则处理并删除,未超时的则圈数-1(圈数+step唯一确定一个定时事件)
只有一个时间轮则无法应付足够数量的定时事件,如有1~2^20个不同时间的,则一个时间轮就效率堪忧
这时可以考虑使用多个时间轮,模仿时钟进位的思想。