关于多线程下条件变量的作用这里就不多讲解了,这里主要是针对条件变量操作时需要注意一个特性虚假唤醒,首先看一段代码。
task * _deal_task = NULL;
//lock
pthread_mutex_lock(&m_thread_mutex);
if(!m_task_queue.empty()) {
//get task
_deal_task = m_task_queue.front();
m_task_queue.pop();
}else{
printf("produce_consumer condition wait\n");
//deal spurious wakeup - other singal affect this wait
while(m_task_queue.empty()) {
pthread_cond_wait(&m_thread_cond, &m_thread_mutex);
//if program recv stop break this while
if(m_stop){
break;
}
}
}
//unlock
pthread_mutex_unlock(&m_thread_mutex);
上述代码中可以发现在pthread_cond_wait上层有一层队列循环检测,目的就是为了处理虚假唤醒,因为我们用条件变量的时候等待cond信号,这个时候可能因为某些特殊条件,我们的cond_wait会被意外唤醒,所以我们需要再次对资源进行检测,确保是否达到所有触发的条件,如果没有满足条件我们则继续进行等待,如果满足就认为是正确的唤醒信号。