定时器的实现
reference
https://www.ibm.com/developerworks/cn/linux/l-cn-timers/
https://www.cnblogs.com/zhanggaofeng/p/9410639.html
定时器是各类开源项目中很重要的一个组件,可用于定时执行一些更新、清理等任务。本文介绍两种定时器的实现方式优先队列
和TimingWheel
。
首先我们从定时器的使用上来看如何实现一个定时器。一般我们会用到三种接口
run_at(timestamp, call_back, args)
run_after(timout, call_back, args)
run_every(interval, call_back, args)
其中run_after与run_at是一回事,只会运行call_back一次,而run_every则是周期性的运行call_back。
优先队列实现定时器
我们把用户的输入包装成一个定时任务作为优先的一个节点,优先队列的对头保存超时最近的节点。还需要有一个线程定时的去查看该队列的队头任务是否到期,如果到期就执行任务,注意任务的执行线程。实现大体如下:
int timerfd = timerfd_create();
timerfd_settime(interval);
epoll_ctr(...)
loop {
epoll_wait()
if (queue.top().time <= current_time) {
task = queue.pop();
task();
if (task.interval) {
queue.push(task(new_time))
}
}
}