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