muduo源码剖析之Timer定时器

简介: Timer 类是 muduo 网络库中的一个定时器类,用于在指定的时间间隔后执行某个任务。Timer 类提供了一系列的方法来创建、启动、停止和删除定时器,以及设置定时器的时间间隔和回调函数等。在 muduo 网络库中,Timer 类被广泛应用于各种网络任务中,例如定期发送心跳包、更新缓存、清理资源等。通过使用 Timer 类,我们可以方便地实现定时任务,提高网络应用程序的可靠性和稳定性。:启动定时器,在指定的时间间隔后调用回调函数。:停止定时器,不再执行定时任务。

简介

Timer 类是 muduo 网络库中的一个定时器类,用于在指定的时间间隔后执行某个任务。

Timer 类提供了一系列的方法来创建、启动、停止和删除定时器,以及设置定时器的时间间隔和回调函数等。

在 muduo 网络库中,Timer 类被广泛应用于各种网络任务中,例如定期发送心跳包、更新缓存、清理资源等。通过使用 Timer 类,我们可以方便地实现定时任务,提高网络应用程序的可靠性和稳定性。

以下是 muduo 网络库中 Timer 类的主要方法和功能:

  1. Timer::start():启动定时器,在指定的时间间隔后调用回调函数。
  2. Timer::stop():停止定时器,不再执行定时任务。
  3. Timer::restart():重新启动定时器,重新开始执行定时任务。
  4. Timer::reset():重新设置定时器的时间间隔和回调函数。
  5. Timer::getExpiryTime():获取定时器的到期时间。

通过使用 Timer 类,我们可以方便地实现各种定时任务,提高网络应用程序的可靠性和稳定性。同时,Timer 类也提供了一些高级功能,例如可以设置多个定时器,以及在多个线程中安全地使用定时器等。

源码剖析

Timer.h

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.

// Author: Shuo Chen (chenshuo at chenshuo dot com)
//
// This is an internal header file, you should not include this.

#ifndef MUDUO_NET_TIMER_H
#define MUDUO_NET_TIMER_H

#include "muduo/base/Atomic.h"
#include "muduo/base/Timestamp.h"
#include "muduo/net/Callbacks.h"

namespace muduo
{
   
namespace net
{
   

///
/// Internal class for timer event.
///
class Timer : noncopyable
{
   
 public:
  Timer(TimerCallback cb, Timestamp when, double interval)
    : callback_(std::move(cb)),
      expiration_(when),
      interval_(interval),
      repeat_(interval > 0.0),
      sequence_(s_numCreated_.incrementAndGet())
  {
    }

  //调用回调函数
  void run() const
  {
   
    callback_();
  }

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

  //刷新时间戳
  void restart(Timestamp now);

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

 private:
  //超时回调函数
  const TimerCallback callback_;
  //时间戳
  Timestamp expiration_;
  //时间间隔
  const double interval_;
  //是否重复
  const bool repeat_;
  //顺序编号
  const int64_t sequence_;


  //生成顺序的编号
  static AtomicInt64 s_numCreated_;
};

}  // namespace net
}  // namespace muduo

#endif  // MUDUO_NET_TIMER_H

Timer.cc

// Copyright 2010, Shuo Chen.  All rights reserved.
// http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.

// Author: Shuo Chen (chenshuo at chenshuo dot com)

#include "muduo/net/Timer.h"

using namespace muduo;
using namespace muduo::net;

AtomicInt64 Timer::s_numCreated_;

void Timer::restart(Timestamp now)
{
   
  if (repeat_)
  {
   
    expiration_ = addTime(now, interval_);
  }
  else
  {
   
    expiration_ = Timestamp::invalid();
  }
}
目录
相关文章
|
传感器 JSON 物联网
什么是MQTT遗嘱消息?如何配置和处理遗嘱消息?
什么是MQTT遗嘱消息?如何配置和处理遗嘱消息?
1171 0
什么是MQTT遗嘱消息?如何配置和处理遗嘱消息?
|
存储 监控 Linux
深入理解epoll:高效I/O多路复用的核心技术(上)
深入理解epoll:高效I/O多路复用的核心技术
|
安全 数据安全/隐私保护
【密码学】一文读懂线性反馈移位寄存器
在正式介绍线性反馈移位寄存器(LFSR)之前,先来看一个小故事,相传在遥远的古代,住着4个奇怪的人。
1983 0
【密码学】一文读懂线性反馈移位寄存器
|
SQL 数据可视化 关系型数据库
SQLite3使用笔记(1)——查询
SQLite3使用笔记(1)——查询
773 0
|
Java Go 数据库
Go语言在微服务架构中的优势与实践
【10月更文挑战第10天】Go语言在微服务架构中的优势与实践
|
JSON 物联网 数据格式
什么是MQTT 遗嘱消息(Will Message)
【2月更文挑战第17天】
1048 7
什么是MQTT 遗嘱消息(Will Message)
|
Linux 编译器 API
探索Qt图像处理的奥秘:从入门到精通
探索Qt图像处理的奥秘:从入门到精通
1144 2
|
NoSQL Linux 网络协议
GDB(十)--调试正在运行的进程
我编写了一个循环:     long i;    for (i = 0; i < 999999; i++) {        mt.a += 1;        sleep(1);    }把它编译成a.out,并在后台执行它:./a.out & [1] 2570 然后用命令gdb ./a.out 2570可以附加到这个进程上。
2311 0
|
存储 数据挖掘
对自己手机的一次取证之路
对自己手机的一次取证之路
543 0