Как много потоков могут ожидать условную переменную, если мы поместим мьютекс перед ней? - PullRequest
1 голос
/ 01 марта 2012

pthread_cond_broadcast используется для пробуждения нескольких потоков, ожидающих условную переменную.Но в то же время также говорится, что мы должны поместить мьютекс перед условной переменной, чтобы избежать условий гонки.

Итак, если мьютекс есть, и один поток уже его удерживает и, таким образом, ожидаетпеременная, как любой другой поток может содержать тот же мьютекс (для входа в ожидающую часть)?

1 Ответ

3 голосов
/ 01 марта 2012

Когда поток вызывает pthread_cond_wait(), он должен содержать связанный мьютекс.API освободит мьютекс, пока он блокирует поток.Как только API решит, что поток должен быть освобожден, он получит мьютекс перед возвратом из API.

Требуется удержание мьютекса, поскольку проверка условия с последующим вызовом pthread_cond_wait() не является атомарной операцией.Мьютекс (и правильное использование мьютекса) не позволяет потоку пропустить условие, которое становится истинным за короткий промежуток времени между проверкой и вызовом ожидания.

Но короткий ответ на конкретный вопрос (как может другойпоток получает мьютекс), поскольку поток заблокирован в pthread_cond_wait(), мьютекс не удерживается.

...