前言 linux平台下,线程等待和唤醒操作是很常见的,但是平台函数不易使用;笔者对此操作做了封装,使之更易于使用。
线程等待和唤醒函数比较
平台提供了线程等待相关函数,这些函数之间用法也有些差异:
sleep 线程等待,等待期间线程无法唤醒。pthread_cond_wait 线程等待信号触发,如果没有信号触发,无限期等待下去。
pthread_cond_timedwait 线程等待一定的时间,如果超时或有信号触发,线程唤醒。
通过上表,可以看出pthread_cond_timedwait函数是最为灵活,使用也最为广泛。sleep的缺陷是当有紧急事件到达时,线程无法及时唤醒。pthread_cond_wait缺陷是:必须借助别的线程触发信号,否则线程自身无法唤醒,如果使用函数,线程无法处理定时任务。
一般情况下,线程要做的工作可能有:定期处理某个事物;无事可做时,线程挂起;有事可做时,立即唤醒工作。要完成上面所述的功能,必须用pthread_cond_timedwait函数,本文介绍的就是对该函数封装。
线程唤醒操作还涉及互斥量pthread_mutex_t,感觉与我们理解的等待和唤醒操作无关;此函数的引入,增加了理解难度。本文封装完全屏蔽了此概念。
函数定义如下
//函数涉及的变量 typedef struct ThreadSignal_T { BOOL relativeTimespan; //是否采用相对时间 pthread_cond_t cond; pthread_mutex_t mutex; pthread_condattr_t cattr; } ThreadSignal; //初始化 void ThreadSignal_Init(ThreadSignal *signal,BOOL relativeTimespan); //关闭 void ThreadSignal_Close(ThreadSignal *signal); //等待n毫秒 void ThreadSignal_Wait(ThreadSignal *signal, int ms); //唤醒线程 void ThreadSignal_Signal(ThreadSignal *signal);