Зачем нам нужны 2 переменные для семафоров в задаче «Потребитель производителя»? - PullRequest
0 голосов
/ 11 ноября 2018

Стандартный способ реализации Producer Consumer:

  • useQueue мьютекс
  • emptyCount семафор размером N
  • fullCount семафор размером N

продукты:

down(emptyCount)
down(useQueue)
putItemIntoQueue(item)
up(useQueue)
up(fullCount)

потреблять:

down(fullCount)
down(useQueue)
item ← getItemFromQueue()
up(useQueue)
up(emptyCount)

Где, если down имеет неположительное значение, поток ожидает. up увеличивает счет

Взято из этой статьи в Википедии

Почему у нас не может быть что-то вроде:

class NewSemaphore {
    int capacity, permits;

    /**
     * Initialize the semaphore with a max capacity
     * @param n the max capacity
     */
    NewSemaphore(int n) {
        capacity = n;
        permits = 0;
    }

    /**
     * We usually never check this. Check if it's within limits.
     * If not, wait
     */
    synchronized void up() {
        if (permits >= capacity) {
            wait();
        } else {
            permits++;
            notify();
        }
    }

    /**
     * Standard down/acquire function
     */
    synchronized void down() {
        if (permits <= 0) {
            wait();
        } else {
            permits--;
            notify();
        }
    }
}

Это будет называться как:

продукция:

up(mySemaphore)
down(useQueue)
putItemIntoQueue(item)
up(useQueue)

потреблять:

down(mySemaphore)
down(useQueue)
item ← getItemFromQueue()
up(useQueue)

Зачем нам нужны 2 разные переменные emptyCount и fullCount?

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

Нет, два семафора на самом деле не нужны, вот единственное решение семафора, написанное на C, посмотрите здесь: https://github.com/heguihua/unisem

0 голосов
/ 11 ноября 2018

Есть два семафора, потому что есть две вещи, которые мы контролируем. Во-первых, потребители ждут, когда нечего потреблять, а во-вторых, производители ждут, если очередь заполнена.

Ваша идея позволит производителям продолжать производство, пока у них не кончится память или какой-либо другой ресурс.

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