Это вызвало бы большее голодание, когда ресурсы всегда доступны и pthread_cond_wait не нуждается в запуске.В этом случае у вас будет мьютекс всего цикла.Так что, если N очень велико, то, блокируя весь цикл, вы можете голодать другими потоками, которым нужен мьютекс.
Как правило, рекомендуется блокировать самые маленькие области, чтобы избежать голодания других потоков и взаимоблокировок.
Подумайте также, когда кто-то придет поддержать этот цикл.Будет очень просто добавить несколько дополнительных операторов или функций в тело цикла for и создать больше голодания.Сопровождающий может легко пропустить блокировку в коде.Лучше всего предотвратить это, создав функцию, отвечающую за получение ресурса i.Эта функция будет отвечать за всю блокировку, исключая любую вероятность того, что вызывающий код может увеличить размер критической секции.
// blocks till resource resourceNum is obtained
void acquire_resource(int resourceNum)
{
lock(mutex)
while(!resource_available[a[i]]) {
pthread_cond_wait(&cond_w[a[i]], &mutex);
}
unlock(mutex)
}
for(int i = 1; i < N; ++i) {
acquire_resource(i);
}