日期:2014-05-16  浏览次数:20565 次

linux的定时器实现问题
大家好,我想实现这样的定时器:
1,可以随时的开启,
2,可是随时的关闭,
3,等开启后如果超时了则调用我的超时处理函数!

我的实现思路是这样的:
创建一个线程,让他一直循环,用一个标志位检测退出,在循环体中不断的读取系统时间,根据系统时间差来计算是否超时,等超时了,调用超时处理函数。
代码如下:

C/C++ code

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
int g_timerStartFlag;
inline unsigned long get_time()  ///return ms;
{
    struct timeval tv = {0};
    gettimeofday(&tv, 0);
    return tv.tv_sec*1000+tv.tv_usec/1000;
}
int count;
void *createTimer(void *arg)
{
   int timecnt=0;
    pthread_detach(pthread_self());
    
    unsigned long lasttime=get_time();
    while(g_timerStartFlag)   ///
    {        
     
        unsigned long nowtime;
        nowtime=get_time();    
      if(nowtime-lasttime>=500)  ///500ms
      {
          printf("timeout------\n");
          lasttime = nowtime;
      }    
    }
    fprintf(stderr,"break;"); 
    return NULL;
}
void libck_createTimerAndStart(void)
{
      pthread_t timeid;   
    g_timerStartFlag=1;
       pthread_create(&timeid, NULL, &createTimer, NULL);  ////    
  
}
int main()
{
    int i;
    libck_createTimerAndStart();
    while(1)
    {
        for(i=0;i<1000000;i++);        
    }
        return 0;
}




可是这样做有个问题: 就是当我的别的程序如果频繁的开启定时器(同一时刻开多个,同一时刻关多个等等),那么就需要不断的创建定时器线程,关闭定时器,就需要不断的销毁线程,这样对系统很是消耗。
请问下有没有别的好方法,谢谢!


------解决方案--------------------
请使用select+pipe做定时器,谢谢.

线程创建和销毁的开销就不用你操心了.