Почему в производителе / потребителе переключение порядка вверх (мьютекс) и вверх (заполнение) приводит к взаимоблокировке?

#deadlock #semaphore #producer-consumer

#взаимоблокировка #семафор #производитель-потребитель

Вопрос:

Давайте используем код на странице Википедии в качестве примера.

 semaphore mutex = 1;
semaphore fillCount = 0;
semaphore emptyCount = BUFFER_SIZE;

procedure producer() {
    while (true) {
        item = produceItem();
        down(emptyCount);
            down(mutex);
                putItemIntoBuffer(item);
            up(mutex);
        up(fillCount);
    }
}

procedure consumer() {
    while (true) {
        down(fillCount);
            down(mutex);
                item = removeItemFromBuffer();
            up(mutex);
        up(emptyCount);
        consumeItem(item);
    }
}
  

Почему замена позиции up(mutex) и up(fillCount) в функции producer гарантирует взаимоблокировку? Я пытаюсь создать экземпляр, но, похоже, не могу его найти.