pthread_cond_wait 信号量丢失
服务器在使用pthread_cond_wait的时候遇到一个问题。具体描述如下
一个主进程,给n个从线程发送计算请求,主进程会等待n个线程返回,在执行下一步
从线程计算完毕后,最后一个线程会通知主线程。如下是示意性代码
main_process() { for(int i = 0; i < n; ++i) { pthread_create(pid, slave_thread, ¬ify) } 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类的信号量,其实现是队列,能够保证不丢信号,当然有资料说,其系统调用的开销也很大。