muduo学习笔记(一)——TimerQueue

  muduo的timer模块其实并不是完整的timer解决方案,而是建立在timerfd_settime上的适用于muduo网络io线程的封装模块。
  第一,muduo之所以需要封装,是因为对fd的节约,如果每一个定时器需求都使用一个fd,那么连接量很大的情况下,fd的数量将会很容易被耗尽。
  第二,muduo对于管理的定时,采用的是比较粗暴的有序列表:

typedef std::set<Entry> TimerList;
TimerList timers_;

  每次需要加入新的timer时,直接强塞

  {
    std::pair<TimerList::iterator, bool> result
      = timers_.insert(Entry(when, timer));
    assert(result.second); (void)result;
  }

  并且如果发现新塞入的定时器时间小于列表里第一个定时器时间(在上一步之前判断)

  if (it == timers_.end() || when < it->first)
  {
    earliestChanged = true;
  }

  就调用

resetTimerfd(timerfd_, timer->expiration());

  将timerfd_对应的时间设置为新时间
  相比之下,像linux内核对于定时器的管理就复杂多了
linux内核定时器
  这是因为muduo的使用特性决定的,单纯做网络io也不需要多少定时器,不像操作系统。在单loop定时器数量有限的情况下,这种简单的自动sort的列表,反而比复杂的管理系统更高效。不过做上层应用尤其做游戏,就别想着用这个定时器了,还是自己撸一套更好,一个单位几十个定时器,分分钟教你做人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值