Может ли кто-нибудь объяснить код C сигнала переменной состояния, передаваемого всем ожидающим потокам, с помощью pthread_cond_broadcast ()? - PullRequest
5 голосов
/ 06 апреля 2011

Может ли кто-нибудь объяснить код C, который демонстрирует использование сигнала переменной условия, передаваемого всем ожидающим потокам, с помощью pthread_cond_broadcast ()?

1 Ответ

14 голосов
/ 06 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...