pthread_cond_broadcast() 应该在多个线程可能正在等待条件变量时使用,但其中一些线程可能还没有准备好继续。 pthread_cond_signal() 可能会唤醒其中一个线程; pthread_cond_broadcast() 将他们全部唤醒,这样如果有任何人可以继续,一个人会。
例如,我们可能有一个互斥锁来保护两个变量 x 和 y。一些线程在这种情况下等待:
pthread_mutex_lock(&mutex);
while (x < 10)
pthread_cond_wait(&cond, &mutex);
而其他人在这种情况下等待:
pthread_mutex_lock(&mutex);
while (x < 10 || y < 5)
pthread_cond_wait(&cond, &mutex);
如果一个线程将x 增加到 10 以上但留下y 小于 5,那么它应该使用pthread_cond_broadcast(&cond),因为任何等待第二个条件的线程还没有准备好运行,所以我们必须确保至少有一个来自第一个条件的线程被唤醒(如果有任何等待该条件的线程)。
可以使用pthread_cond_broadcast() 的另一种情况是当所有个等待线程可以继续进行时(例如,当一组线程应该停止等待并退出时)。
要记住正确代码的一件事是 pthread_cond_signal() 是一种优化,仅此而已 - 如果您的代码是正确的,那么如果每个 pthread_cond_signal() 都被 pthread_cond_broadcast() 替换,它也应该可以工作(但也许不是一样有效)。