zoukankan      html  css  js  c++  java
  • 多定时器队列

     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);
    }
  • 相关阅读:
    while...break 实例
    java ++ -- 异或 短路与 短路或 三目条件
    Java StringBuffer与StringBuider
    输入任意5个整数,输出它们的和。
    java输入年份和月份,输出天数
    进制转换
    luogu 4884 多少个1?
    SDOI2013 随机数生成器
    CQOI2018 破解D-H协议
    模板BSGS(SDOI2011计算器) 模板EXBSGS
  • 原文地址:https://www.cnblogs.com/likeyiyy/p/3652038.html
Copyright © 2011-2022 走看看