Работает ли семафорное решение для нескольких производителей? - PullRequest
0 голосов
/ 11 декабря 2018

Это проблема буфера максимального размера.Производитель не может произвести, если буфер заполнен, и потребитель должен ждать, если буфер пуст.По-видимому, это решение с использованием семафоров работает только для одного производителя и потребителя.Может кто-нибудь объяснить мне, почему это не работает для нескольких производителей и потребителей?

has_space = Semaphore(max_num)
has_elements = Semaphore(0)
mutex = lock()

def producer():
  has_space.acquire()
  with mutex:
      # add elements
  has_elements.release()

def consumer():
  has_elements.acquire()
  with mutex:
      # retrieve elements
  has_space.release()

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Чтобы работали несколько производителей, нам нужно убедиться, что каждый производитель исключает уникальный буферный узел из пула буферов.Чтобы несколько производителей - потребителей работали синхронно, вам потребуется реализация потоковой очереди буферов, пожалуйста, отметьте здесь .

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

0 голосов
/ 12 декабря 2018

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

Модель с одним производителем и одним потребителем просто блокирует потребителя до тех пор, покапроизводитель действует, затем блокирует производителя, пока не действует потребитель.Нет никаких указаний, если общий буфер пуст или заполнен.Обратите внимание, что число семафоров не совпадает с полным или пустым состоянием буфера.

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