Ищите хорошую аналогию / примеры семафора для контрольных стихов - PullRequest
3 голосов
/ 07 мая 2009

Монитор должен решать проблемы с семафорами в параллельных средах.
Я ищу хорошую аналогию с использованием семафора стихов монитора.

Пожалуйста, используйте информацию для аналогии:
4 задачи (TaskA, TaskB, TaskC, TaskD)
1 переменная varX

Каждая задача хочет манипулировать varX на основе какого-либо события.

Ответы [ 3 ]

7 голосов
/ 07 мая 2009

Допустим, группа пациентов хочет пойти к врачу.

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

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

Это в основном одно и то же, мониторы просто более структурированы, чем семафоры.

2 голосов
/ 02 сентября 2012

Вы также можете видеть монитор в качестве общественного туалета. Когда кто-то входит в закрытую дверь туалета, человек внутри хочет, чтобы никто больше не находился в этом месте (то есть монитор). Все остальные люди (темы) должны стоять в очереди перед туалетом и ждать (wait ()). Только после того, как человек внутри закончил, он вышел, и следующий человек мог войти.

У некоторых людей, которые ждут, могут быть проблемы с запорами. По понятным причинам они не хотят входить или возвращаться, если они не готовы правильно пользоваться туалетом. Здесь они хотят подождать (wait ()), пока их желудок не подаст им сигнал (signal ()), что они готовы пойти в туалет. Прежде чем это произойдет, они пропустят всех остальных.

Источник: www.mijnadres.net/published/Monitor%20Object%20Pattern.pdf

1 голос
/ 24 июля 2009

Важно отделить конфликт ресурсов от уведомления о событии. Монитор и семафор используются для ограничения доступа к общему ресурсу. Монитор - это, по сути, семафор, число которых равно 1. Если каждая из ваших задач хочет получить доступ к одному varX, вам необходимо защитить его с помощью монитора (или семпахора 1):

Monitor.Enter 
// do something with varX
Monitor.Exit

или

Semaphore.Acquire
// do something with varX
Semaphore.Release

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

Ник.

...