问题描述: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;
}
运行结果: