日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 多个定时器,timer: 一个Linux下的超级精简的多重定时器:可实现成千上万个定时任务,定时精度可达纳秒级别,且同一时间点可添加不同的任务!适用于云后台服务和嵌入式等各种环境。...

發布時間:2025/3/12 linux 50 豆豆

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下的超级精简的多重定时器:可实现成千上万个定时任务,定时精度可达纳秒级别,且同一时间点可添加不同的任务!适用于云后台服务和嵌入式等各种环境。...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。