条件变量的虚假唤醒

使用方式:

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调用:宁愿多发信号,也要避免不发信号导致信号丢失。

你可能感兴趣的:(#,【04】Linux网络编程)