Использование одного 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...
Другие вопросы по тегам