条件变量为何要和互斥锁一起使用


while(条件判断){
    pthread_cond_wait(&cond, &lock);
}

在上面的情况中,如果我们不使用互斥锁,可能在 while 语句之后,当前线程还未进入 wait ,但是另一个线程调用了 pthread_cond_singal,此时这个 singal 就丢失了。

所以,在操作条件变量时需要加上互斥锁:

pthread_mutex_lock(&lock);
while(条件判断){
    pthread_cond_wait(&cond, &lock);
}
pthread_mutex_unlock(&lock);

但是看了上面的代码你可能会产生疑问,如果线程进入 wait 阻塞状态,那么互斥锁还咋解锁呢?别的线程如何调用 pthread_cond_singal 呢?

这里就必须要理解 pthread_cond_wait 了,它实际做的事情可以分为 4 部分:

① 将当前线程加入等待队列;

② pthread_mutex_unlock(&mutex);

③ wait 等待唤醒;

④ pthread_mutex_lock(&mutex);

所以线程在进入 wait 前已经解开了互斥锁,当被唤醒时会重新上锁。之所以要这么做,是因为我们必须要保证解锁和 wait 是原子操作,不然解了锁还没进入 wait 的阶段条件变量可能会发生改变

相关