muduo 源码分析(三)定时器

本文详细介绍了muduo库中的定时器设计,包括使用例子、类结构和实现细节。重点讲解了如何添加定时器、超时处理和取消定时器的机制。muduo的定时器基于timerfd系统函数,通过EventLoop接口提供runAt、runAfter和runEvery等操作,并利用std::set维护排序。超时时,回调用户函数并可能重启可重复定时器。取消定时器则避免对正在执行的函数影响。
摘要由CSDN通过智能技术生成

Table of Contents

1. 使用例子

2.类结构:

3.实现细节

3.1 Add timer

3.2 Timeout

3.3 Cancel timer


本篇介绍一下定时器。muduo里的定时器也是经过精心设计的(这句话好像有点废)。

1. 使用例子

EventLoop 类提供了4个和定时器相关的接口:

  // timers

  ///
  /// Runs callback at 'time'.
  /// Safe to call from other threads.
  ///
  TimerId runAt(const Timestamp& time, const TimerCallback& cb);
  ///
  /// Runs callback after @c delay seconds.
  /// Safe to call from other threads.
  ///
  TimerId runAfter(double delay, const TimerCallback& cb);
  ///
  /// Runs callback every @c interval seconds.
  /// Safe to call from other threads.
  ///
  TimerId runEvery(double interval, const TimerCallback& cb);
  ///
  /// Cancels the timer.
  /// Safe to call from other threads.
  ///
  void cancel(TimerId timerId);
  • runAt : 在某个时间点执行用户函数
  • runAfter : 在N秒后执行用户函数
  • runEvery : 每N秒执行用户函数
  • cancel : 停止某个定时器的计时

前面3个函数最终都会调用TimerQueue::addTimer(...), 3.1节会详细介绍,cancel() 则会在3.3节讲述。

2.类结构:

muduo的定时器主要由TimerQueue, Timer, TimerId和Timestamp四个类实现,类的关系如下图:

 为了很好地复用Eventloop的框架,muduo采用了 timerfd_create / timerfd_gettime / timerfd_settime 系统函数来实现定时器的功能。定时器超时,timer对应的fd变为可读,TimerQueue就执行符合条件的用户函数。

3.实现细节

  • 3.1 Add timer

TimerQueue保证timer是按时间先后排序的,插入的timer如果超时时间比已有的timers都要早,则要通过timerfd_settime函数调整timeout的值。

TimerId TimerQueue::addTimer(const TimerCallback& cb,
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值