2015-11-25 2 views
1

Я работаю на синхронизации процессов, с улучшенной версией проблемы бассейна:семафоров: расширение бассейн

Купальщица хочет пойти в бассейн:

  • Они должны принять пустая корзина
  • Они должны пойти в свободной кабинке
  • Они положили их купальник, положите свою одежду в корзину и оставьте кабинку
  • Они плавают
  • Они возвращаются в свободную кабину с их корзинами
  • Они положили свою одежду обратно, и оставить кабину
  • Они дают пустой корзине назад
  • Существует ограниченное количество корзин и Ячейки
  • Если купальщик не может найти пустую корзину или бесплатный кабинку, он будет ждать, пока один не доступен

Улучшенная версия:

  • Есть члены и не члены
  • Членов имеет приоритет над не являющимися членами
  • Если один ресурс становится доступным, оно будет даны ожидающим членом, а если нет, то будет дано кто ждет.

Чтобы сделать это, я думал, что я использую 3 семафоров: один для корзин, по одному для кабинок, и один для членов ожидания. Таким образом, когда член ожидает, семафор блокирует любой процесс, вызывающий P(s_members), и когда член, наконец, получит корзину, он называет V(s_members). Но в очереди может быть несколько членов, и семафор не должен «выпускать» нечлен каждый раз, когда вызывается V(s_members). Вот почему я думал sembuf.sem_op = 0; бы хорошее дело, потому что не-члены должны ждать 0.
Проблема в том, что с этим решением:

  • , не являющихся членами должны называть P(s_members) перед вызовом P(s_basket) или P(s_cubicle) ,
  • нечлены должны позвонить P(s_members), чтобы заснуть и оказаться в очереди с другими, но им не нужно увеличивать/уменьшать значение семафора, потому что это не зависит от них.
  • Участники, ожидающие ресурсов, нуждаются в вызове P(s_members), чтобы увеличить/уменьшить его значение (потому что они находятся в очереди), но им не нужно засыпать и продолжать ждать своей корзины.
  • Представьте себе этот случай: член, не являющийся членом, ждет свою корзину, и в настоящий момент в очереди нет членов. Затем появляется член, и, очевидно, он тоже ждет ресурсов. На этом этапе нечлены, которые тоже ждали, должны заснуть, пока член не покинет очередь, но они уже спят, ожидая их корзины, а это значит, что они уже вызвали P(s_members). В результате правило приоритета не применяется.

Как мы можем это решить?
Надеюсь, это достаточно ясно, трудно объяснить и легко повредить все это. Благодарим вас за то, что вы читаете это время.

EDIT:
Извините, если я отправил это на ложном StackExchange сообщества, я буду думать дважды об этом в следующий раз!

+0

Это не задача stackoverflow для разработки кода, это не задача stackoverflow для анализа вашего проблемного сценария. Мы здесь, чтобы ответить на два вопроса: 1) почему он не компилируется и 2) почему создается неправильный вывод. В любом случае вы должны опубликовать свой код, и в первом случае укажите точно, что не компилируется. а во втором случае - ввод, ожидаемый вывод и фактический вывод. В общем, никакого кода, никакой помощи. Мы не будем делать домашнее задание для вас. – user3629249

+0

Благодарим за помощь. – qreon

ответ

2

Представьте себе этот случай: член, не являющийся членом, ждет свою корзину, а там в данный момент нет в нашей очереди. Затем появляется член, и, очевидно, он тоже ждет ресурсов. На этом этапе нечлены, которые тоже ждали, должны заснуть, пока член не покинет очередь, но они уже спали, ожидая корзины , что означает, что они уже вызвали P (s_members). В результате правило приоритета не применяется.

Так что вы говорите, что «если не член переходит спать в той же очереди, что и члены, мы ввернуты». Согласен. После того, как не-член перейдет спать в очередь, вы не сможете точно вытащить их позже.

Поскольку не члены и члены не могут ждать ресурса на одном и том же семафоре, s_basket должен быть ошибочным.

Как насчет попыток s_basket_members и s_basket_nonmembers?

Я считаю, что вам также нужно будет отслеживать несколько int s, например, сколько членов/нечленов ждут и сколько корзин доступно.

+0

Я собираюсь попробовать это, у меня есть несколько идей, спасибо за подсказку :-) – qreon

Смежные вопросы