C++后台服務如何高效實現多個定時器任務


大部分雲端的后台服務,經常會使用到定時器功能來檢測一些狀態值的變化,且當定時器較多時,就需要設計統一的定時器管理模塊來維護所有的定時器資源。然而要設計性能良好的定時器和管理模塊,是需要一定的經驗和技巧的,所以,姑且在此炫技一回,分享一下定時器模塊設計的方法,主要從數據結構的角度來考慮。

采用自下而上的層次來設計,首先將每個定時器作為一個定時器節點的數據結構,結構體如下所示:

struct Node {
    time_t start_time;  //上一次觸發的時間,用於比較是否到點
    int timerId; //定時器id,唯一標識
    int timeVal; //間隔多少秒執行一次
    int count;   //當前觸發次數
    int total;   //總的觸發次數
    bool type;    //是否無限循環
    bool isUsed;   //是否被使用了
    Timer* timerObj;  //執行定時任務的處理對象,其他使用到定時器的類需要以Timer作為基類
    Node* next_node;
    Node* prev_node;
}

定時器節點管理模塊如下所示:

class Manager {
    Node* nodes;   //指向所有節點構成的數組的指針
    int maxCount;  //最大時間節點的數目
    int idleCount;  //空閑的時間節點數目
    Node idleHead;  //空閑節點的第一個節點,當申請創建新時間節點時,從這里取
    Node usedHead;  //當對所有定時器進行循環檢測時,從這里開始
}

其對外提供的接口有:

  1. 設置並啟動定時器
  2. 檢測所有定時器任務是否間隔時間已經達到,達到后,則調用timerObj多態繼承的基類函數來執行定時任務。

寫在最后:為了使整個定時管理模塊能夠運行起來,應該設置一個線程來周期性的檢測所有定時任務時間是否到達,一般情況會每秒檢測一下,同時會與epoll網絡模型結合起來用。


免責聲明!

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



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