多定时器队列

 1 /*************************************************************************        
 2     > File Name: time_queue.h                                                                                   
 3     > Author: likeyi                                                                                            
 4     > Mail: likeyiyy@sina.com                                                                                   
 5     > Created Time: Fri 04 Apr 2014 05:47:42 PM CST                                                             
 6  ************************************************************************/        
 7                                                                                                                 
 8 #ifndef TIME_QUEUE_H                                                                                            
 9 #define TIME_QUEUE_H                                                                                            
10 #include "dulist.h"                                                                                             
11 typedef void (Function) (void * arg);                                                                           
12 typedef struct time_node                                                                                        
13 {                                                                                                               
14     unsigned long remain_time;                                                                                  
15     unsigned long id;                                                                                           
16     Function * fun;                                                                                             
17     void * arg;                                                                                                 
18 }time_node_s;                                                                                                   
19 typedef dulnode multi_timer;                                                                                    
20 void print_time_node(struct time_node * time);                                                                  
21 /*                                                                                                              
22  * 初始化一个定时器                                                                                             
23  * */                                                                                                           
24 struct time_node * timer_init(unsigned long remain_time,Function * fun,void * arg);                                                                                                    
25 /*                                                                                                              
26 * 初始化一个定时器队列。                                                                                        
27 * */                                                                                                            
28 multi_timer * multi_timer_init();                                                                               
29 /*                                                                                                              
30 * 往队列插入一个定时器。                                                                                        
31 * */                                                                                                            
32 int multi_timer_insert(multi_timer * timer_queue,struct time_node * time);        
33 /*                                                                                                              
34  * 遍历定时器,并且执行到期的定时器的函数                                                                       
35  * */                                                                                                           
36 int multi_timer_traverse(multi_timer * timer_queue);                              
37 /*                                                                                                              
38  * 在队列上删除一个定时器                                                                                       
39  * */                                                                                                           
40 int multi_timer_delete(multi_timer * timer_queue, unsigned long id);              
41 /*                                                                                                              
42  * 重置一个定时器的值                                                                                           
43  * */                                                                                                           
44 int multi_timer_reset(multi_timer * timer_queue,unsigned long id,unsigned long value);
45 #endif 
multi_timer.h
/*************************************************************************
    > File Name: time_queue.c
    > Author: likeyi 
    > Mail: likeyiyy@sina.com 
    > Created Time: Fri 04 Apr 2014 05:47:48 PM CST
 ************************************************************************/
                     
#include "includes.h"
                     
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t get_id_mutex = PTHREAD_MUTEX_INITIALIZER;
static unsigned long id; 
static multi_timer * timer_queue;
static void sig_fun(int id) 
{                    
    //printf("hello I am 
");
    multi_timer_traverse(timer_queue);
}                    
static unsigned long get_id()
{                    
    return ++id;     
}                    
void print_time_node(struct time_node * time)
{                    
    printf("remain_time:%lu ",time->remain_time);
    printf("id:%lu ",time->id);
    printf("fun:%p
",time->fun);
}                    
/*                   
 * 初始化一个定时器  
 * */                
struct time_node * timer_init(unsigned long remain_time,Function * fun,void * arg)
{                    
    pthread_mutex_lock(&get_id_mutex);
    unsigned long nid = get_id();
    pthread_mutex_unlock(&get_id_mutex);
    struct time_node * ntimer = (void *)malloc(sizeof(struct time_node));
    if(ntimer == NULL)
    {                
        printf("Error,when malloc time node
");
        exit(-1);    
    }                
    ntimer->remain_time = remain_time;
    ntimer->id = nid;
    ntimer->fun = fun;
    ntimer->arg = arg;
    return ntimer;   
}                    
/*                   
* 初始化一个定时器队列。
* */                 
multi_timer * multi_timer_init()
{                    
    pthread_mutex_lock(&mutex);
    list_init(&timer_queue);
    signal(SIGALRM,sig_fun);
    struct itimerval value, ovalue;
    value.it_value.tv_sec       = 1;
    value.it_value.tv_usec      = 0;
    value.it_interval.tv_sec    = 1;
    value.it_interval.tv_usec   = 0;
    setitimer(ITIMER_REAL, &value, &ovalue);
    pthread_mutex_unlock(&mutex);
    return timer_queue;
}
/*
* 往队列插入一个定时器。
* 插入定时器这个操作,应该加锁。
* */
int multi_timer_insert(multi_timer * timer_queue,struct time_node * time)
{
    int i = 0;
    multi_timer * timer = timer_queue->next;
    while(timer != timer_queue)
    {
        struct time_node * t = (struct time_node *)timer->data;
        if(time->remain_time > t->remain_time)
        {
            timer = timer->next;
        }
        else
        {
            break;
        }
        i++;
    }
    pthread_mutex_lock(&mutex);
    list_insert(timer_queue,i+1,(void*)time);
    pthread_mutex_unlock(&mutex);
}
/*
 * 遍历定时器,并且执行到期的定时器的函数
 * */
int multi_timer_traverse(multi_timer * timer_queue)
{
    assert(timer_queue != NULL);
    multi_timer * t = timer_queue->next;
    while(t != timer_queue)
    {
        struct time_node * ntime = (struct time_node *)t->data;
        if((--ntime->remain_time <= 0) && (ntime->fun != NULL))
        {
            ntime->fun(ntime->arg);
            multi_timer_delete(timer_queue,ntime->id);
        }
        t = t->next;
    }
    //list_traverse(timer_queue, print_time_node);
}
/*
 * 在队列上删除一个定时器
 * */
int multi_timer_delete(multi_timer * timer_queue, unsigned long id)
{
    multi_timer * t = timer_queue->next;
    int i = 0;
    struct time_node * ntime = NULL;
    while(t != timer_queue)
    {
        i++;
        ntime = (struct time_node *)t->data;
        if(ntime->id != id)
        {
            t =t -> next;
        }
        else
        {
            //printf("I can at here 
");
            list_delete(timer_queue,i,&ntime);
            free(ntime);
            return 0;
        }
    }
    //printf("I am leaver
");
}
 
/*
 * 重置一个定时器的值
 * */
int multi_timer_reset(multi_timer * timer_queue,unsigned long id,unsigned long value)
{
    multi_timer * t = timer_queue->next;
    int i = 0;
    struct time_node * ntime = NULL;
    pthread_mutex_lock(&mutex);
    while(t != timer_queue)
    {
        i++;
        ntime = (struct time_node *)t->data;
        if(ntime->id != id)
        {
            t = t->next;
        }
        else
        {
            ntime->remain_time = value;
            pthread_mutex_unlock(&mutex);
            return 0;
        }
    }
    pthread_mutex_unlock(&mutex);
}
原文地址:https://www.cnblogs.com/likeyiyy/p/3652038.html