
服务器在使用pthread_cond_wait的时候遇到一个问题。具体描述如下
一个主进程,给n个从线程发送计算请求,主进程会等待n个线程返回,在执行下一步
从线程计算完毕后,最后一个线程会通知主线程。如下是示意性代码
main_process()
{ for(int i = ; i < n; ++i)
{
pthread_create(pid, slave_thread, ¬ify)
}
notify.lock_and_wait();
} void slaver_thread()
{
if(some_guard_value == )
{
notify->signal();
}
}
在实际中,当有n==1,时,并且计算任务不密集时,最后一个线程很快的signal了,main_process中还没有执行到lock_and_wait中,最终main_thread会阻塞在此处。
如果lock_and_wait中执行的是带超时的,则应该很快返回的任务,最坏情况下的才得到返回。
在*中对此有描述,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类的信号量,其实现是队列,能够保证不丢信号,当然有资料说,其系统调用的开销也很大。