linux线程中usleep卡死问题

之前的一个项目遇到过一个linux线程中usleep卡死问题。

细查之下,发现usleep是非可重入的,也是非线程安全的。因此,我寻找一些替换线程中的usleep的方法。

个人感觉比较完美的是是用条件信号量。另外用select也行。个人倾向条件信号量,因为条件信号量会挂起线程,不占用cpu,而select实际是轮询,还是占用cpu的。

下面介绍下条件信号量的要点,具体用法,大家度娘去。

条件信号量分两种一种是无条件等待(也就是一定要等到信号发过来),一种是我要说的限时等待pthread_cond_timedwait(即超时后自动继续执行,当然接收到信号也可继续执行)。

下面具体说下

采用pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t *mutex, const struct timespec *abstime)设置等待条件变量cond,如果超时,则返回;如果等待到条件变量cond,也返回。

 

 当pthread_cond_timedwait()被调用时,调用线程必须已经锁住了mutex。函数pthread_cond_timedwait()会对mutex进行【解锁和执行对条件的等待】(原子操作)。这里的原子意味着:解锁和执行条件的等待是原则的,一体的。(In this case, atomically means with respect to the mutex andthe condition variable and other access by threads to those objectsthrough the pthread condition variable interfaces.)。简单点说就是必须和mutex一起使用,执行pthread_cond_timedwait()时会阻塞线程等待信号的同时会把muex解锁。当超时或等到信号,函数返回时,mutex将又会被该线程锁住。

 

       如果等待条件满足或超时,或线程被取消,调用线程需要在线程继续执行前先自动锁住mutex,如果没有锁住mutex,产生EPERM错误。即,该函数返回时,mutex已经被调用线程锁住。

 

       等待的时间通过abstime参数(绝对系统时间,过了该时刻就超时)指定,超时则返回ETIMEDOUT错误码。开始等待后,等待时间不受系统时钟改变的影响。

 

       尽管时间通过秒和纳秒指定,系统时间是毫秒粒度的。需要根据调度和优先级原因,设置的时间长度应该比预想的时间要多或者少点。可以通过使用系统时钟接口gettimeofday()获得timeval结构体。

 

 

posted @ 2013-02-03 11:33  colin_chan  阅读(5852)  评论(0编辑  收藏  举报