@git
最近小程序要用到定時器,找了一圈也沒找到合適的,最後仍是繞回來選擇了muduo裏面的TimerQueue,整理了下它的代碼,獨立了出來,由於實在懶得從頭寫一個- -!。github
原來的muduo中TimerQueue是專爲EventLoop提供定時功能的組件,我在筆記
muduo網絡庫學習筆記(三)TimerQueue定時器隊列中解讀過muduo這塊代碼,如今反過來,EventLoop作爲TimerQueue的組件,TimerQueue啓動後在後面開一個線程跑EventLoop,EventLoop裏面進行阻塞的poll循環,只監聽timerFd,和EventFd,從而獨立出來一個單獨的定時器隊列。。小程序
[Async] [thread-safe] [based on poll] [microseconds-level]安全
異步
:後臺線程監視文件描述符動態。
線程安全
: 多線程安全的 支持異步插入定時器。
基於poll
: 非休眠機制實現。
級別
: 微妙級別。網絡
#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 1548293190
811373
[test] : test timerQue happended at 1548293190
811392
[test] : test timerQue happended at 1548293192
811787
[test] : test timerQue happended at 1548293194
811927
[test] : test timerQue happended at 1548293199
812081
[test] : test timerQue happended at 1548293204
812645
[test] : test timerQue happended at 1548293209
813508多線程
TimerQueue
: https://github.com/BethlyRoseDaisley/TimerQueue/tree/master/TimerQueue 歡迎收藏。app