一個基於C++11的定時器隊列(timerfd,poll實現)


@


前言

最近小程序要用到定時器,找了一圈也沒找到合適的,最后還是繞回來選擇了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 歡迎收藏。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM