C语言定时任务库的实现(一)

目的

在项目开发过程中,我们常常需要定时的执行一些任务,通常的做法我们会创建一个线程,然后在线程里执行一个定时任务,如果有N个定时任务,则需要启动N个定时任务。这种做法有以下几个弊端。

1、频繁的创建线程可能会影响系统的整体运作性能。

2、每实现一个定时任务,则需要考虑任务的创建,销毁,任务的执行,而且大部分的内容是冗余的。

3、多任务之间的同步问题。

为了解决以上问题,我实现了一个多实例单线程多任务的定时器库。

实现方案

数据结构


typedef struct {struct list_head       head;                    // 链表头mtimer_task_callback   run;                     // 任务回调unsigned int        id;                         // 定时任务idunsigned int        last_tick;                  // 上一次执行的时间unsigned int        timeout;                    // 定时的超时时间,msmtimer_task_mode    mode;                       // 定时任务的工作模式,两种工作模式。void           *user_data1;                     // 定时任务的上下文1void           *user_data2;                     // 定时任务的上下文2unsigned int        remove;                     // 定时任务是否标记删除
} mtimer_task;                                      // 定时任务节点typedef struct {struct list_head    list;                       // 任务列表pthread_mutex_t  lock;                          // 锁unsigned int            id;                     // 待分配的定时器任务idmtimer_get_current_time get_current_time;       // 获取ms值的接口
} mtimer_handle;                                    // 定时器实例

工作模式

定时器有两种工作模式

typedef enum {MTIMER_MODE_LOOP = 0,        // 循环任务,每隔一个timeout执行一次MTIMER_MODE_NOT_LOOP,        // 非循环任务,仅在timeout时执行一次
} mtimer_task_mode;

接口

/*****************************************************************************函 数 名  : mtimer_create功能描述  : 创建定时器库实例输入参数  : mtimer_get_current_time func  输出参数  : 无返 回 值  : voidNULL    : 创建失败非NULL   : 创建成功*****************************************************************************/
void *mtimer_create(mtimer_get_current_time func);/*****************************************************************************函 数 名  : mtimer_destroy功能描述  : 销毁定时器库实例输入参数  : void *handle  输出参数  : 无返 回 值  : int0   成功<0  失败*****************************************************************************/
int mtimer_destroy(void *handle);/*****************************************************************************函 数 名  : mtimer_task_reg功能描述  : 注册定时器任务输入参数  : void *handle                 mtimer_task_callback run  任务回调unsigned int    timeout   超时时间mtimer_task_mode    mode  LOOP:循环, 每隔timeout触发一次; NOT_LOOP:仅运行一次void       *user_data1    回调参数1void       *user_data2    回调参数2输出参数  : 无返 回 值  : unsigned返回定时器id*****************************************************************************/
unsigned int mtimer_task_reg(void *handle,mtimer_task_callback run,unsigned int    timeout,mtimer_task_mode    mode,void       *user_data1,void       *user_data2);/*****************************************************************************函 数 名  : mtimer_task_unreg功能描述  : 反注册定时器任务输入参数  : void *handle          unsigned int task_id   定时任务id  输出参数  : 无返 回 值  : 0: 反注册成功<0: 反注册失败*****************************************************************************/
int mtimer_task_unreg(void *handle, unsigned int task_id);/*****************************************************************************函 数 名  : mtimer_schedule功能描述  : 定时任务调度输入参数  : void *handle    unsigned int n  最多可执行的定时任务数,防止线程阻塞太长时间输出参数  : 无返 回 值  : 0  执行正常<0  执行异常*****************************************************************************/
int mtimer_schedule(void *handle, unsigned int n);

使用范例

int func1(void *data1, void *data2)
{log_error("[time:%u, func1], data1:%s, data2:%s\n", Clock_GetTimeMs(),(char *)data1, (char *)data2);return 0;
}int func2(void *data1, void *data2)
{log_error("[time:%u, func2], data1:%s, data2:%s\n", Clock_GetTimeMs(),(char *)data1, (char *)data2);return 0;
}void *mtimer_debug_loop(void *handle)
{unsigned id1, id2;log_error("tick: %u------------------------------------ 1\n\n",Clock_GetTimeMs());id1 = mtimer_task_reg(handle, func1, 500, MTIMER_MODE_LOOP, "1data1", "1data2");id2 = mtimer_task_reg(handle, func2, 1000, MTIMER_MODE_NOT_LOOP, "2data1","2data2");while (1) {mtimer_schedule(handle, 10);Clock_SleepMs(100);}mtimer_destroy(handle);return NULL;
}int mtimer_debug()
{void *handle;if (IS_NULL(handle = mtimer_create(Clock_GetTimeMs))) {log_error("mtimer_create failed\n");return -1;}pthread_t tid;pthread_create(&tid, NULL, mtimer_debug_loop, (void *)handle);pthread_detach(tid);return 0;
}

完整代码

代码还没有整理好,后续整理完之后会有更新,迫切需要的可以私聊


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部