Bootstrap

Linux下如何在一个进程中使用多个定时器

问题描述:windows下的接口支持单进程中拥有多个定时器,而linux则只允许单进程拥有一个定时器,因此在linux下的单进程中要使用多个定时器,则需要自己维护管理。

解决方法 一:linux下多定时器的实现(经典)_51CTO博客_linux 定时器

但是,上面的办法过于复杂,对于实现一个简单的功能,或不做工程的初学者来说比较复杂。

解决方法 二:

      看APUE神书时候看到的,方法比较冷门,通过使用select(),来设置定时器;原理利用select()方法的第5个参数,第一个参数设置为0,三个文件描述符集都设置为NULL,第5个参数为时间结构体,这种方法精度能够达到微妙级别,网上有很多基于select()的多线程定时器,说明select()稳定性还是非常好。

下面是在多线程下利用select实现多线程定时器

#include <iostream>
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/time.h>  
#include <sys/types.h>  
#include <unistd.h> 
#include <pthread.h> 
 
 
int set_timer_s(long u32Time)
{
	struct timeval stuTime; 
	int ret = 0;
	memset(&stuTime, 0, sizeof(struct timeval));  
    stuTime.tv_sec = u32Time;  
    stuTime.tv_usec = 0; 
	
	ret = select(0 ,NULL, NULL,NULL, &stuTime);  
	if(ret == 0)
	{
		std::cout<<"set_timer_s time come in:"<<u32Time<<std::endl;
	}
	
	return 0;
 
}
 
 
int set_timer_ms(long time_out_ms)
{
	struct timeval stuTime; 
	int ret = -1;
	memset(&stuTime, 0, sizeof(struct timeval));  
    stuTime.tv_sec = time_out_ms / 1000;  
    stuTime.tv_usec = time_out_ms % 1000;  
	ret = select(0 ,NULL, NULL,NULL, &stuTime);  
	if(ret == 0)
	{
		std::cout<<"set_timer_ms time come in"<<std::endl;
	}
	
	return 0;
}
 
 
void * func_s(void *arg)  
{  
    if(arg == NULL)
    {
		return NULL;
	}
 
	long *pu32time_s = (long *)arg;
	
	set_timer_s(*pu32time_s);
 
	//do func 
	
    return NULL;  
}  
  
 
int main()
{
	pthread_t  thread_id_01;  
    pthread_t  thread_id_02;  
    pthread_t  thread_id_03;  
    pthread_t  thread_id_04;  
    pthread_t  thread_id_05;
	long time_s = 60;
	pthread_create(&thread_id_01, NULL, func_s, &time_s);  
	long time_s2 = 10;
	pthread_create(&thread_id_02, NULL, func_s, &time_s2);  
 
	long  time_s3 = 20;
	
	pthread_create(&thread_id_03, NULL, func_s, &time_s3);  
 
	long  time_s4 = 30;
	pthread_create(&thread_id_04, NULL, func_s, &time_s4);  
 
	long  time_s5 = 40;
 
	pthread_create(&thread_id_05, NULL, func_s, &time_s5);  
 
	set_timer_s(70);
	return 0;
}

运行结果:

 

;