大部分雲端的后台服務,經常會使用到定時器功能來檢測一些狀態值的變化,且當定時器較多時,就需要設計統一的定時器管理模塊來維護所有的定時器資源。然而要設計性能良好的定時器和管理模塊,是需要一定的經驗和技巧的,所以,姑且在此炫技一回,分享一下定時器模塊設計的方法,主要從數據結構的角度來考慮。
采用自下而上的層次來設計,首先將每個定時器作為一個定時器節點的數據結構,結構體如下所示:
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; //當對所有定時器進行循環檢測時,從這里開始 }
其對外提供的接口有:
- 設置並啟動定時器
- 檢測所有定時器任務是否間隔時間已經達到,達到后,則調用timerObj多態繼承的基類函數來執行定時任務。
寫在最后:為了使整個定時管理模塊能夠運行起來,應該設置一個線程來周期性的檢測所有定時任務時間是否到達,一般情況會每秒檢測一下,同時會與epoll網絡模型結合起來用。