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()
(но, возможно, нет). как эффективно).