分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
linux下多定时器的实现
一、已有的定时器接口
时空管理是计算机系统的主要任务。在时间管理中,我们经常利用定时器处理事情:比如tcp协议中利用定时器管理包超时,视频显示中利用定时器来定时显示视频帧,web服务中利用定时器来管理用户的超时。windows系统提供了SetTimer和timeSetEvent等定时器接口,linux中则提供了setitimer等接口。这些函数的接口很类似,大体上都是用户提供回调函数和超时时间向OS注册一个定时器事件,OS在超时时间到了的时候,调用用户提供的回调函数来完成用户想要做的事情。windows下的接口支持单进程中拥有多个定时器,而linux则只允许单进程拥有一个定时器,因此在linux下的单进程中要使用多个定时器,则需要自己维护管理,这是本文写作的出发点。另外,OS提供的定时器管理算法在大规模定时器的管理方面可能还不尽人意,这时候就需要用户去优化管理算法了,本文在这方面提供了一点素材。
二、一个最简单的多定时器的实现(linux版)
1、实现细节
这个实现允许用户使用多个自定义的定时器,每个自定义的定时器将周期地被触发直到其被删除。实现的主要思路是:
i)首先在初始化多定时器(init_mul_timer)时利用setitimer注册一个基本的时间单位(如1s)的定时事件;
ii)用户需要set_a_timer注册 自定义定时器 时,在timer_manage管理结构中记录这个定时器的回调函数和定时周期等参数;
iii)当基本的时间单位到期后(如SIGALRM信号到达时),遍历整个timer_manage,如果有自定义定时器的超时时间到了,就执行相应的回调函数,并将 自定义定时器 的超时时间置为最初值;否则将 自定义定时器 的超时时间相应地减一个基本的时间单位;
iv)用户通过del_a_timer来删除某个定时器,通 过destroy_mul_timer来删除整个多定时器。
2、代码
i) mul_timer.h
/* This file provides an interface of multiple timers. for convenience, it simplify signal processing. * Also, it can't be used in multithreading environment. * Author:bripengandre * Date:2009-04-29 */ #ifndef _MUL_TIMER_H_ #define _MUL_TIMER_H_ #include <sys/time.h> #define MAX_TIMER_CNT 10 #define MUL_TIMER_RESET_SEC 10 #define TIMER_UNIT 60 #define MAX_FUNC_ARG_LEN 100 #define INVALID_TIMER_HANDLE (-1) typedef int timer_handle_t; typedef struct _timer_manage {
struct _timer_info {
int state; /* on or off */ int interval; int elapse; /* 0~interval */ int (* timer_proc) (void *arg, int arg_len); char func_arg[MAX_FUNC_ARG_LEN]; int arg_len; }timer_info[MAX_TIMER_CNT]; void (* old_sigfunc)(int); void (* new_sigfunc)(int); struct itimerval value, ovalue; }_timer_manage_t; /* success, return 0; failed, return -1 */ int init_mul_timer(void); /* success, return 0; failed, return -1 */ int destroy_mul_timer(void); /* success, return timer handle(>=0); failed, return -1 */ timer_handle_t set_a_timer(int interval, int (* timer_proc) (void *arg, int arg_len), void *arg, int arg_len); /* success, return 0; failed, return -1 */ int del_a_timer(timer_handle_t handle); #endif /* _MUL_TIMER_H_ */
ii)mul_timer.c
#include <stdio.h> #include <string.h> #include <signal.h> #include <time.h> #include "mul_timer.h" static struct _timer_manage timer_manage; static void sig_func(int signo); /* success, return 0; failed, return -1 */ int init_mul_timer(void) {
int ret; mems