Совершенно нормально использовать один и тот же мьютекс для нескольких условных переменных, но не наоборот.
Один из способов обдумать это: Часть контракта pthread_cond_wait
заключается в том, что когда вызывающий поток пробуждается от своего ожидания, он будет владеть заблокированным мьютексом, что имеет смысл, только если с условием связано только одно мьютекс. переменная.
Чтобы понять, почему вы можете захотеть это сделать, представьте себе конструкцию, в которой у вас есть несколько глобальных счетчиков, защищенных одним мьютексом (количество пользователей, количество открытых файлов и т. Д.). Тогда вы вполне можете иметь несколько условных переменных, от которых вы, возможно, захотите ждать, все они связаны с этим единственным мьютексом:
pthread_cond_wait(&usercount_lessthan_limit_cond, &global_mutex);
...
pthread_cond_wait(&openfilecount_lessthan_limit_cond, &global_mutex);
...etc...