任何人都可以解释使用pthread_cond_broadcast()向所有等待线程广播的条件变量信号的C代码吗?

use*_*940 5 c

任何人都可以解释使用pthread_cond_broadcast()向所有等待线程广播使用条件变量信号的C代码吗?

caf*_*caf 14

pthread_cond_broadcast()当多个线程可能在条件变量上等待时应该使用,但是其中一些线程可能还没准备好继续. pthread_cond_signal()可能会唤醒其中一个线索; pthread_cond_broadcast()将它们全部唤醒,如果有任何可以继续的话,那就会.

例如,我们可能有一个互斥锁保护两个变量xy.有些线程在这种情况下等待:

pthread_mutex_lock(&mutex);
while (x < 10)
    pthread_cond_wait(&cond, &mutex);
Run Code Online (Sandbox Code Playgroud)

而其他人在这种情况下等待:

pthread_mutex_lock(&mutex);
while (x < 10 || y < 5)
    pthread_cond_wait(&cond, &mutex);
Run Code Online (Sandbox Code Playgroud)

如果一个线程增加到x10以上但是y小于5,那么它应该使用pthread_cond_broadcast(&cond),因为在第二个条件上等待的任何线程还没有准备好运行,所以我们必须确保唤醒第一个条件中的至少一个线程(如果有任何等待的条件).

pthread_cond_broadcast()可以使用的另一种情况是所有等待线程都可以继续(例如,当一组线程应该停止等待和退出时).

要记住正确的代码,pthread_cond_signal()有一件事就是优化,仅此而已 - 如果您的代码是正确的,那么如果每个代码都pthread_cond_signal()被替换pthread_cond_broadcast()(但可能效率不高),它也应该有效.