条件变量为何要和互斥锁一起使用
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 的阶段条件变量可能会发生改变。