网上流行的说法:

条件变量配合着互斥量使用,是为了解决 在线程A中调用了 pthread_cond_wait,但是线程A还没有进入wait cond的时候,线程B调用了pthread_cond_signal,如果不用mutex,这个cond_signal就丢失了,而如果加上了锁,则线程B必须要等到mutex被释放了的时候才能调用pthread_cond_signal。

其实简单写一下代码就比较清楚了


// thread A
while(condition) {
  wait();
}

// thread B
signal();

当线程A进入while内的时候但还没用wait的时候,线程B调用signal,如果不用mutex,这个cond_signal就丢失了,而如果加上了锁,则线程B必须要等到mutex被释放了的时候才能调用pthread_cond_signal。

所以本身就处于临界区,所以需要用mutex来保护。(此描述待定)

正常的用法

pthread_mutex_lock(&mutex);
while(condition) {
  pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);


// thread B
pthread_mutex_lock(&mutex);
signal();
pthread_mutex_unlock(&mutex);

参考链接

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

深入理解Linux 条件变量3:条件变量为什么要配合着锁使用?

条件变量为什么和mutex一起用

陈硕的看法