您的位置:首页 > 编程语言 > C语言/C++

一个基于C++11的定时器队列(timerfd,poll实现)

2019-01-24 11:00 225 查看

目录

@

前言

最近小程序要用到定时器,找了一圈也没找到合适的,最后还是绕回来选择了muduo里面的TimerQueue,整理了下它的代码,独立了出来,因为实在懒得从头写一个- -!。

原来的muduo中TimerQueue是专为EventLoop提供定时功能的组件,我在笔记
muduo网络库学习笔记(三)TimerQueue定时器队列中解读过muduo这块代码,现在反过来,EventLoop做为TimerQueue的组件,TimerQueue启动后在后面开一个线程跑EventLoop,EventLoop里面进行阻塞的poll循环,只监听timerFd,和EventFd,从而独立出来一个单独的定时器队列。。

优点

[Async] [thread-safe] [based on poll] [microseconds-level]

异步
:后台线程监视文件描述符动态。
线程安全
: 多线程安全的 支持异步插入定时器。
基于poll
: 非休眠机制实现。
级别
: 微妙级别。

test

#include <chrono>
#include <iostream>
#include "Logger.hpp"
#include "TimerQueue.hpp"

void test()
{

LOG_DEBUG << "[test] : test timerQue happended ";

std::cout << "[test] : test timerQue happended at " << std::chrono::system_clock::now().time_since_epoch() / std::chrono::microseconds(1) << std::endl;

}

int main()
{

//Logger::setLogLevel(Logger::TRACE);

TimerQueue* timer_queue = TimerQueue::GetInstance();
timer_queue->Start();
timer_queue->runAfter(1.0, test);
timer_queue->runAfter(1.0, test);
timer_queue->runAfter(3.0, test);

timer_queue->runEvery(5.0, test);
getchar();
return 0;
}

./timer_queue_test
[test] : test timerQue happended at 15482931

90
811373
[test] : test timerQue happended at 15482931
90
811392
[test] : test timerQue happended at 15482931
92
811787
[test] : test timerQue happended at 15482931
94
811927
[test] : test timerQue happended at 15482931
99
812081
[test] : test timerQue happended at 15482932
04
812645
[test] : test timerQue happended at 15482932
09
813508

源代码

TimerQueue
: https://github.com/BethlyRoseDaisley/TimerQueue/tree/master/TimerQueue 欢迎收藏。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: