使用方式:
pthread_mutex_lock(&g_threadinfo.mutex); //配合互斥锁使用
while (g_threadinfo.tasknum <= 0)
{
//如果获得了互斥锁,但是条件不合适的话,wait会释放锁,不往下执行。
//当变化后,条件合适,将直接获得锁。
pthread_cond_wait(&g_threadinfo.cond, &g_threadinfo.mutex);
if (!g_threadinfo.thread_running)
break;
}// end inner-while-loop
current = ctrip_thread_pool_retrieve_task();
pthread_mutex_unlock(&g_threadinfo.mutex);
必须要把pthread_cond_wait()放在while里
假设pthread_cond_wait不放在这个while循环里面,正常情况下,pthread_cond_wait因为条件不满足,挂起线程。
然后,当外部条件满足以后,其他线程调用pthread_cond_signal或pthread_cond_broadcast来唤醒挂起的线程。
但是条件变量可能在某些情况下也被唤醒,这个时候pthread_cond_wait处继续往下执行,但是这个时候,条件并不满足(比如任务队列中仍然为空)。这种唤醒我们叫“虚假唤醒”。
为了避免虚假唤醒时,做无意义的动作,我们将pthread_cond_wait放到while循环条件中,这样即使被虚假唤醒了,由于while条件(比如任务队列是否为空,资源数量是否大于0)仍然为true,导致线程进行继续挂起。
为什么在某些情况下会被唤醒?
futex调用:宁愿多发信号,也要避免不发信号导致信号丢失。