Небольшое изменение в заказе производителя семафоров - PullRequest
0 голосов
/ 04 июня 2018

Это классическое решение потребительской проблемы производителя:

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)
    }
}

Мой вопрос: каковы последствия, если мы поменяли местами последние два порядка семафоров у потребителя или производителя?

Дляпример, если код потребителя становится:

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

1 Ответ

0 голосов
/ 04 июня 2018

В этом простом примере результат тот же, и вы не будете испытывать голод или тупик (даже если вторая версия consumer определенно плохая практика).

Рассмотрим более сложную ситуацию (это не должно происходить), когда у вас есть ошибочный потребитель, и у вас есть код между up(emptyCount) и up(mutex), например:

up(emptyCount)
// time-consuming code
up(mutex)

В этом случае у вас, вероятно, будет больше producer с ожиданиядля выпуска mutex, который не является необходимым.Теперь рассмотрим еще худшую ситуацию, когда вам приходится иметь дело с другим семафором между этими двумя инструкциями: в худшем случае это может привести к голоданию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...