当前位置: 技术问答>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方式,软时钟发送时间信号到你的消息队列,在队列中不会丢失,但是实时性不一定太好。根本上说,你的时间处理器中可能包含耗时的因素,不能即时响应,所以才会处理不过来。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。