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做定时器,谢谢.
线程创建和销毁的开销就不用你操心了.