@


前言

最近小程序要用到定时器,找了一圈也没找到合适的,最后还是绕回来选择了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 1548293190811373

[test] : test timerQue happended at 1548293190811392

[test] : test timerQue happended at 1548293192811787

[test] : test timerQue happended at 1548293194811927

[test] : test timerQue happended at 1548293199812081

[test] : test timerQue happended at 1548293204812645

[test] : test timerQue happended at 1548293209813508

源代码

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

一个基于C++11的定时器队列(timerfd,poll实现)的更多相关文章

  1. 一个基于C++11的单例模板类

    #ifndef _SINGLETON_H_#define _SINGLETON_H_ template<typename T>class Singleton : public Uncopy ...

  2. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  3. 教你如何使用Java手写一个基于数组实现的队列

    一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...

  4. 一个基于swoole的作业调度组件,已经实现了redis和rabitmq队列消息存储。

    https://github.com/kcloze/swoole-jobs 一个基于swoole的作业调度组件,已经实现了redis和rabitmq队列消息存储.参考资料:swoole https:/ ...

  5. 发布一个基于协程和事件循环的c++网络库

    目录 介绍 使用 性能 实现 日志库 协程 协程调度 定时器 Hook RPC实现 项目地址:https://github.com/gatsbyd/melon 介绍 开发服务端程序的一个基本任务是处理 ...

  6. 一个基于mysql构建的队列表

    通常大家都会使用redis作为应用的任务队列表,redis的List结构,在一段进行任务的插入,在另一端进行任务的提取. 任务的插入 $redis->lPush("key:task:l ...

  7. 基于C++11实现线程池的工作原理

    目录 基于C++11实现线程池的工作原理. 简介 线程池的组成 1.线程池管理器 2.工作线程 3.任务接口, 4.任务队列 线程池工作的四种情况. 1.主程序当前没有任务要执行,线程池中的任务队列为 ...

  8. 基于spring boot的定时器

    首先,搭建好一个springboot项目 方法一:通过springboot自带入口来开启定时器. 首先我们都知道,springboot有一个自己的入口,也就是@SpringBootApplicatio ...

  9. muduo网络库学习笔记(三)TimerQueue定时器队列

    目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...

随机推荐

  1. vue axios全攻略

    不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解.本来想在网上找找详细攻略,突然发现,axios 的官方文档本身就非常详细!!有这个还要什么自行 ...

  2. 在Spring(4.3.22)中集成Hibernate(5.4.0)

    (1)pom中添加相关依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibe ...

  3. 在手机的浏览器上通过连接打开App

    Android系统中实现 1.在系统系统自带的浏览器中 首先做成HTML的页面,页面内容格式如下: <a href="[scheme]://[host]/[path]?[query]& ...

  4. Java探针-Java Agent技术-阿里面试题

    Java探针参考:Java探针技术在应用安全领域的新突破 最近面试阿里,面试官先是问我类加载的流程,然后问了个问题,能否在加载类的时候,对字节码进行修改 我懵逼了,答曰不知道,面试官说可以的,使用Ja ...

  5. 腾讯云外网IP直通后,遇到网络问题

    通过内网机器,先重启网卡 service network restart cd /usr/local/etc ./modify_route.sh

  6. Linux设备驱动之Ioctl控制【转】

    转自:http://www.cnblogs.com/geneil/archive/2011/12/04/2275372.html 大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力. ...

  7. python创建系统用户和用户组

    #coding=utf8 import pwd import grp import sys from _utils.patrol2 import run_cmd info=None try: info ...

  8. activemq 消息类型

    //文本消息 TextMessage textMessage = session.createTextMessage("文本消息"); producer.send(textMess ...

  9. SpringMVC中fastjson支持jsonp的实现

    前边一篇文章主要说了下前端处理jsonp的方式,这篇主要介绍了后台接收和响应jsonp的一种方式 继承fastjson消息转换器类:com.alibaba.fastjson.support.sprin ...

  10. Mac安装Homebrew记录

    在终端输入: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) ...