当前位置: 技术问答>linux和unix
linux 多个定时器 几乎同时到时 , 部分定时器信号 丢失的问题.
来源: 互联网 发布时间:2015-11-27
本文导语: 一个线程 创建了 几个定时器, 定时器有可能 几乎同时到时, 当线程 正在 处理定时器到时信号时, 又有定时器到时信号到来, 此次定时器到时信号被丢失 请问: 如何使 定时器到时信号, 不被丢失. 此段程序代...
一个线程 创建了 几个定时器,
定时器有可能 几乎同时到时, 当线程 正在 处理定时器到时信号时, 又有定时器到时信号到来, 此次定时器到时信号被丢失
请问: 如何使 定时器到时信号, 不被丢失.
此段程序代码 如下:
void* TimerThread (void * param)
{
pthread_t threadId ;
struct sigaction tmact ;
struct sigevent tmevent ;
int i ;
/*设置信号处理函数*/
sigemptyset (&tmact.sa_mask) ;
tmact.sa_sigaction = TimerHandler ; // 信号处理函数
tmact.sa_flags = SA_SIGINFO ;
sigaction (SIGALRM, &tmact, NULL) ;
for (i = 0; i si_value.sival_int) ;
/*发送消息*/
if (msgsnd (m_MyMsgQ, (struct msgbuf *)&timerMsg,
sizeof (timerMsg) - sizeof (long), IPC_NOWAIT) == -1)
{
printf ("msgsnd : error !!!!!!!!!!!!!!!!!!n") ;
return ;
}
printf ("timer alarm, timer_t : %dn", *(timerMsg.pTimerId)) ;
}
定时器有可能 几乎同时到时, 当线程 正在 处理定时器到时信号时, 又有定时器到时信号到来, 此次定时器到时信号被丢失
请问: 如何使 定时器到时信号, 不被丢失.
此段程序代码 如下:
void* TimerThread (void * param)
{
pthread_t threadId ;
struct sigaction tmact ;
struct sigevent tmevent ;
int i ;
/*设置信号处理函数*/
sigemptyset (&tmact.sa_mask) ;
tmact.sa_sigaction = TimerHandler ; // 信号处理函数
tmact.sa_flags = SA_SIGINFO ;
sigaction (SIGALRM, &tmact, NULL) ;
for (i = 0; i si_value.sival_int) ;
/*发送消息*/
if (msgsnd (m_MyMsgQ, (struct msgbuf *)&timerMsg,
sizeof (timerMsg) - sizeof (long), IPC_NOWAIT) == -1)
{
printf ("msgsnd : error !!!!!!!!!!!!!!!!!!n") ;
return ;
}
printf ("timer alarm, timer_t : %dn", *(timerMsg.pTimerId)) ;
}
|
试一下itimer:
man -k itimer
相关系统调用有:
setitimer
getitimer
man -k itimer
相关系统调用有:
setitimer
getitimer
|
方法有两个,一,接收信号和处理信号应当分离,接收部分尽可能简单,耗时的放到处理部分,二者分于不同线程。二是,采用SOFTTIMER方式,软时钟发送时间信号到你的消息队列,在队列中不会丢失,但是实时性不一定太好。根本上说,你的时间处理器中可能包含耗时的因素,不能即时响应,所以才会处理不过来。