linux 多个定时器,timer: 一个Linux下的超级精简的多重定时器:可实现成千上万个定时任务,定时精度可达纳秒级别,且同一时间点可添加不同的任务!适用于云后台服务和嵌入式等各种环境。...
MT_Timer(MT譯為Multiple或Multi)
一、介紹
一個Linux下的超級簡潔的定時器:利用epoll機制和timerfd新特性實現的多重、多用、多個定時任務實現。只需要使用TIMER_CREATE()接口創建一個定時器實體,即可向其添加成千上萬個定時任務,定時任務可達到納秒級別的精度,且可在同一時間點添加不同的定時任務!。
二、軟件接口
整個定時器包含如下幾類接口。
創建和聲明定時器實例:使用定時器的第一步就是使用TIMER_CREATE()創建一個定時器實例,在其它文件使用到該定時器時,使用TIMER_DECLEAR()進行聲明:
TIMER_CREATE(name);
TIMER_DECLEAR(name);
初始化和反初始化定時器:在正式使用定時器之前,首先使用TIMER_INIT()初始化前面創建的定時器實例,name是實例名稱,max是創建定時器要檢測的定時任務數量;當不再使用定時器時,可使用TIMER_DEINIT()反初始化定時器(退出定時器,并釋放所有資源):
TIMER_INIT(name, max);
TIMER_DEINIT(name);
添加和刪除定時任務:
TIMER_ADD(name, itimespec, repeat, cb, data);
TIMER_DEL(name, timerfd);
TIMER_ADD()用于向定時器實例name中添加一個定時任務,其參數描述如下:
ittimespec是定時任務的定時時間和循環時間,其結構體類型如下:
struct timespec {
time_t tv_sec; // seconds
long tv_nsec; // nanoseconds
};
struct itimerspec {
struct timespec it_value;
struct timespec it_interval;
};
其中it_value即是超時時間(相對時間),若想定義周期定時任務,則設置it_interval成員;若不想定義周期定時任務,則需設置it_interval成員都為0。因此,第一次超時和后面周期定時任務是可以使用不同時間的。
repeat是周期定時任務的重復次數,若設置為**-1,代表永遠重復;0,代表一次都不執行**;因此repeat應至少為1,或者使用-1;
cb為定時任務超時回調函數,其類型為:void (*timer_callback_t)(void *data);
data為定時任務回調函數的參數,為void *類型,用戶可指定為自己定義的結構體;
TIMER_ADD()添加定時任務成功返回新定時任務的文件描述符,失敗返回 < 0。返回的文件描述符,可用于在TIMER_DEL()中刪除定時任務。
查詢和清空定時任務
TIMER_COUNT(name);
TIMER_CLEAR(name);
TIMER_COUNT(name)用于查詢定時器實例name中現存的定時任務個數;TIMER_CLEAR(name)用于清空定時器實例name中的所有定時任務。
三、使用實例
下面是一個非常簡單的使用示例:共創建了兩個定時任務,每個第一次超時都是3S,后面每隔1S超時一次;但第一個定時任務頻次為8,第二個定時任務頻次為3;當所有定時任務都超時后,輸入回車即可退出:
#include
#include
#include
#include "mt_timer.h"
void timeout_handle(void *arg)
{
printf("[%ld]:timeout1\n", time(NULL));
}
void timeout_handler(void *arg)
{
printf("[%ld]:timeout2\n", time(NULL));
}
TIMER_CREATE(test);
int main(void)
{
int timer;
struct itimerspec itimespec;
TIMER_INIT(test, 10);
itimespec.it_value.tv_sec = 3;
itimespec.it_value.tv_nsec = 0;
itimespec.it_interval.tv_sec = 1;
itimespec.it_interval.tv_nsec = 0;
timer = TIMER_ADD(test, &itimespec, 8, timeout_handle, NULL);
TIMER_ADD(test, &itimespec, 3, timeout_handler, NULL);
printf("[%ld]:timer_add : %d\n", time(NULL), TIMER_COUNT(test));
sleep(4);//getchar();
TIMER_DEL(test, timer);
printf("[%ld]:timer_del : %d\n", time(NULL), TIMER_COUNT(test));
TIMER_CLEAR(test);
printf("[%ld]:timer_clear : %d\n", time(NULL), TIMER_COUNT(test));
getchar();
TIMER_DEINIT(test);
return 0;
}
四、贊賞作者
五、參與貢獻
Fork 本倉庫
新建 Feat_xxx 分支
提交代碼
新建 Pull Request
六、碼云特技
使用 Readme_XXX.md 來支持不同的語言,例如 Readme_en.md, Readme_zh.md
GVP 全稱是碼云最有價值開源項目,是碼云綜合評定出的優秀開源項目
總結
以上是生活随笔為你收集整理的linux 多个定时器,timer: 一个Linux下的超级精简的多重定时器:可实现成千上万个定时任务,定时精度可达纳秒级别,且同一时间点可添加不同的任务!适用于云后台服务和嵌入式等各种环境。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序设计基础——c语言篇,C语言程序设计
- 下一篇: java记事本保存_JAVA记事本关于保