Использование одного pthread_mutex_t и умножения pthread_cond_t с помощью pthread_cond_wait()
Согласно Открытой группе базовых спецификаций, выпуск 7, IEEE Std 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 ответ
Совершенно нормально использовать один и тот же мьютекс для нескольких условных переменных, но не наоборот.
Один из способов думать об этом: Часть контракта pthread_cond_wait
в том, что когда вызывающий поток пробуждается из своего ожидания, он владеет заблокированным мьютексом, что имеет смысл, только если с переменной условия связан только один мьютекс.
Чтобы понять, почему вы можете захотеть это сделать, представьте себе конструкцию, в которой у вас есть несколько глобальных счетчиков, защищенных одним мьютексом (количество пользователей, количество открытых файлов и т. Д.). Тогда вы вполне можете иметь несколько условных переменных, от которых вы можете ждать, все они связаны с этим единственным мьютексом:
pthread_cond_wait(&usercount_lessthan_limit_cond, &global_mutex);
...
pthread_cond_wait(&openfilecount_lessthan_limit_cond, &global_mutex);
...etc...