TimerQueue Class源码阅读

TimerQueue Class源码阅读

@(Linux多线程服务端编程:使用muduoC++网络库读书笔记)


TimerQueue Class封装了基于 timerfd的计时器,可是它承担什么工作呢?单纯是确定当前的时间吗?超时回调,超时的时候进行什么工作吗?它来帮助 epoll实现0轮询吗?

TimerQueue Class涉及两个相关类型:Timer ClassTimerId Class

Timer Class源码阅读

Timer Class维护定时器的各种信息:超时时间、触发间隔、触发周期、序列号等。

数据成员

  • TimerCallback callback_

回调函数,可是这个回调函数,只在run里被调用吗?

  • Timestamp expiration_

到期时间

  • const double interval_

周期触发间隔

  • const bool repeat_

是否周期触发,如果interval_不为0,repeat_便为true

  • sequence_

定时器的序列号,似乎是通过一个静态变量s_numCreated_递增的。

函数成员

  • static int64_t numCreated() { return s_numCreated_.get(); }

这是干嘛的?

  • Timestamp expiration() const { return expiration_; } bool repeat() const { return repeat_; } int64_t sequence() const { return sequence_; }

获取到期时间/是否重复/序列号

  • void run() const

运行callback_()

  • void restart(Timestamp now)

如果是可重复的,就根据interval重新设置expiration_。不然就设置expiration_为0。

TimerId Class

TimerId Class是暴露给用户的,通过Timer* timer_int64_t sequence_唯一确定一个定时器。

数据成员

  • Timer* timer_

Timer Class对象

  • int64_t sequence

就是它所保存的timer_Timer::sequence_

函数成员

只有构造函数。

TimerQueue Class

TimerQueue Class是基于timerfd实现的定时器功能。使用 M O N O T O N I C MONOTONIC MONOTONIC时间,即以绝对时间为准,获取从系统启动到现在的时间。

数据成员

  • EventLoop* loop_

当前TimerQueue CLass所属 I / O 线 程 I/O线程 I/O线

  • const int timerfd_

timerfd句柄,在构造函数中初始化

  • Channel timerfdChannel_

负责监控timerfd_Channel Class

  • std::set<std::pair<Timestamp,Timer*>> timers_

<到期时间,Timer地址>排序的红黑树,用于快速找到最先到期的Timer Class对象,或者根据给定时间找出所有到期的Timer
问题1:set重定义的排序在哪儿?难道不需要吗?

  • std::set<std::pair<Timer*,int64_t>> activeTimers_

<Timer地址,序列号>排序的红黑树,用于在执行TimerQueue::cancel()时,根据TimerID Class快速查找有无对应的Timer

  • callingExpiredTimers_

在执行到期定时器的回调函数(Timer::run)时为true,否则为false

  • std::set<std::pair<Timer*,int64_t>> cancelingTimers_

callingExpiredTimers_true时,一些定时器到期后会被从activeTimers_中剔除,但是周期性的定时器会稍后加入avtiveTimers_中。在定时器不在activeTimers_的这段时间里,如果要执行TimerQueue::cancelInLoop是找不到这些定时器的。于是选择将其放入cancelingTimers中,当执行TimerQueue::reset时时,这些周期性的
cancelingTimers_中的定时器不会被重置。

函数成员

  • TimerQueue(EventLoop* loop);

初始化相关数据成员,并监视timerfd_的读事件,并设置timerfd_的读回调为TimerQueue::handleRead

  • TimerId addTimer(TimerCallback cb,Timestamp when,double interval);

根据输入的到期回调函数cb,到期时间when,重复间隔interval创建一个新的Timer Class对象。同时将其加入timers_activeTimers_中(TimerQueue::addTimerInLoop)。但是本函数(TimerQueue::addTimer)可能会在别的线程调用,而timers_activeTimers_没有被锁保护,所以addTimerInLoop要被注册到EventLoop::pendingFuntors_中(EventLoop::runInLoop())在EventLoop::loop()的循环中调用,在 I / O I/O I/O线程中执行将新Timer Class对象添加到timers_activeTimers_中的任务。

  • void addTimerInLoop(Timer* timer)

执行将timer添加到timers_activeTimers_中的任务(``insert) 如果新加入的timer为第一个timer或者它的到期时间比当前最早的到期时间还要早,则调整timerfd的到期时间(resetTimerfd,其中封装了timerfd_settime`)。

  • bool insert(Timer* timer)

timer插入到TimerQueue::timers_TimerQueue::activeTimers_中。注意这里activeTimers_pair的第二项sequence就是Timer::sequence_。结合上面提到的activeTimes_<Timer*,int64_t>用于分辨TimerID Class对象,我们可以知道TimerID::sequence_就是它所保存的timer_Timer::sequence_

  • void handleRead()

读事件被触发,证明eventfd_上有事件可读,即有定时器到期,执行删除操作、执行到期回调函数、重设eventfd_等操作。
1 获取当前时间,获取到当前时间为止所有到期的定时器(getExpired())
2 执行到期定时器的到期回调函数Timer::run
3 遍历到期定时器序列,周期性触发且不存在于cancelingTimers_的重新加入timers_activeTimers_(insert),其余的删除,并更新eventfd_的等待时间。(reset

  • std::vector<std::pair<Timestamp, Timer*>> getExpired(Timestamp now)

将到now为止的过期事件,从timers_activeTimes_中剔除,并组织成数组返回。

  • void reset(const std::vector<std::pair<Timestamp, Timer*>>& expired, Timestamp now)

遍历到期定时器序列,周期性触发且不存在于cancelingTimers_的重新加入timers_activeTimers_(insert),其余的删除,并更新eventfd_的等待时间。

  • void cancel(TimerId timerId)

timers_activeTimers_中剔除timerId的相关内容。因为这个也必须在 I / O 线 程 I/O线程 I/O线中进行所以也是向EventLoop::runInLoop注册了回调(cancelInLoop

  • void cancelInLoop(TimerId timerId)

具体执行剔除操作
如果被剔除的timerId就存在于activeTimers_中那直接剔除
不然,并且callingExpiredTimers_为真,那就保存到cancelingTimers_
不然就什么都不做

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Javaclass仓库管理系统的源代码是一个用Java编写的仓库管理系统,它提供了一套完整的仓库管理功能,并且具备良好的扩展性和易用性。 该系统主要包含以下几个模块:顾客管理模块、商品管理模块、库存管理模块、订单管理模块和报表管理模块。 在顾客管理模块,系统可以进行顾客信息的录入、查询、修改和删除等操作,以便对顾客进行有效的管理和沟通。 在商品管理模块,系统可以对商品进行录入、查询、修改和删除,并且可以设置商品的价格、库存等相关信息,方便进行仓库的销售和管理。 在库存管理模块,系统可以实时跟踪库存数量,并及时更新库存信息,从而保证库存的准确性和及时性。 在订单管理模块,系统可以生成订单、处理订单、查询订单信息,并及时更新订单的状态,以便及时配送和安排工作。 在报表管理模块,系统可以生成销售报告、库存报告等各种报告,以便对仓库的经营状况进行分析和决策。 此外,该系统还具备用户权限管理、日志记录、数据备份等功能,以确保安全性和可靠性。 通过使用Javaclass仓库管理系统,用户可以方便地管理仓库的各项业务,提高工作效率,并准确了解仓库的经营状况,为企业的发展提供良好的支持。系统的源代码提供一套规范、可扩展的开发框架,方便开发者进行二次开发和定制,以满足不同企业的特定需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值