Использование одного pthread_mutex_t и умножения pthread_cond_t с помощью pthread_cond_wait () - PullRequest
3 голосов
/ 02 декабря 2011

В соответствии с Открытой базовой спецификацией группы, выпуск 7, стандарт IEEE 1003.1-2008, не следует использовать одну переменную условия (pthread_cond_t) для разных мьютексов (pthread_mutex_t) в pthread_cond_wait(), в то время как хотя бы один потокожидание этой условной переменной: например,pthread_cond_wait(&cond1, &mutex1) нельзя использовать параллельно с pthread_cond_wait(&cond1, &mutex2): это поведение не определено.

Но оно не указано, если разрешено использование одного мьютекса с несколькими переменными условия, например: pthread_cond_wait(&cond1, &mutex1) параллельнос pthread_cond_wait(&cond2, &mutex1).

Я думаю, что такой конструкции следует избегать, чтобы обеспечить безопасное (двухстороннее)

динамическое связывание, [...] сформированное между этим мьютексом и переменной условия

Может ли кто-нибудь прокомментировать этот вопрос?

1 Ответ

10 голосов
/ 02 декабря 2011

Совершенно нормально использовать один и тот же мьютекс для нескольких условных переменных, но не наоборот.

Один из способов обдумать это: Часть контракта pthread_cond_wait заключается в том, что когда вызывающий поток пробуждается от своего ожидания, он будет владеть заблокированным мьютексом, что имеет смысл, только если с условием связано только одно мьютекс. переменная.

Чтобы понять, почему вы можете захотеть это сделать, представьте себе конструкцию, в которой у вас есть несколько глобальных счетчиков, защищенных одним мьютексом (количество пользователей, количество открытых файлов и т. Д.). Тогда вы вполне можете иметь несколько условных переменных, от которых вы, возможно, захотите ждать, все они связаны с этим единственным мьютексом:

pthread_cond_wait(&usercount_lessthan_limit_cond, &global_mutex);
...
pthread_cond_wait(&openfilecount_lessthan_limit_cond, &global_mutex);
...etc...
...