pthread_cond_wait 信号量丢失

服务器在使用pthread_cond_wait的时候遇到一个问题。具体描述如下

一个主进程,给n个从线程发送计算请求,主进程会等待n个线程返回,在执行下一步

从线程计算完毕后,最后一个线程会通知主线程。如下是示意性代码

main_process()
{
 
       for(int i = 0; i < n; ++i)
       {
              pthread_create(pid, slave_thread, &notify)
        }
        notify.lock_and_wait();
}

void slaver_thread()
{
      if(some_guard_value == 0)
{ notify
->signal(); } }

在实际中,当有n==1,时,并且计算任务不密集时,最后一个线程很快的signal了,main_process中还没有执行到lock_and_wait中,最终main_thread会阻塞在此处。

如果lock_and_wait中执行的是带超时的,则应该很快返回的任务,最坏情况下的才得到返回。

在stackoverflow中对此有描述,pthread_cond_wait versus semaphore

 And if you cond_signal a condvar with nobody waiting on it then nothing happens.
This is good if you don't know whether there's going to be a listener interested.

一个潜在的解决方案是利用sem_xxx类的信号量,其实现是队列,能够保证不丢信号,当然有资料说,其系统调用的开销也很大。

posted @ 2015-01-23 20:57  westfly  阅读(1416)  评论(0编辑  收藏  举报