muduo学习笔记(一)——TimerQueue

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

typedef std::set TimerList;
TimerList timers_;

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

  {
    std::pairbool> 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内核对于定时器的管理就复杂多了
muduo学习笔记(一)——TimerQueue_第1张图片
  这是因为muduo的使用特性决定的,单纯做网络io也不需要多少定时器,不像操作系统。在单loop定时器数量有限的情况下,这种简单的自动sort的列表,反而比复杂的管理系统更高效。不过做上层应用尤其做游戏,就别想着用这个定时器了,还是自己撸一套更好,一个单位几十个定时器,分分钟教你做人。

你可能感兴趣的:(Python深度开发,muduo)