Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Контрольная работа [вариант 4] / Официанты клиенты

.doc
Скачиваний:
20
Добавлен:
02.05.2014
Размер:
25.6 Кб
Скачать

Для программирования такого взаимодействия будут использованы три семафорные переменные start, client, oficiant и счетчики процессов- официантов -of и процессов – клиентов - cl. Семафор start обеспечивает взаимное исключение при доступе к счетчикам of и cl. Семафор client обеспечивает взаимное исключение процессов-клиентов, а семафор oficiant - процессов- официантов.

Вначале описываются общие переменные процессов. var start =1, client =1, oficiant =1, murex = 1: semaphore; /* Все семафоры инициализируются значением 1 */

of, cl: integer; of, cl:=0; . . .

Client:

{ P(start);     cl: = cl + l; /* пришел очередной процесс-писатель*/     if cl =1 then P(client);

/* Первый пришедший процесс-клиент останавливает старт новых процессов-официантов */

V(start);     if of ≠ O then P(oficiant);

/* Процессы-клиенты должны ждать завершения стартовавших процессов-официантов */

P(mutex)     .../* осуществляется запись */ V(mutex)

P(start);     cl: = cl - 1; /* процесс-клиент завершился*/     if cl=0 then V(client);

/* последний процесс-клиент завершился, семафор client открыт для процессов-официантов*/

V(start); }

Oficiant:

{     L : if cl ≠ 0 then P(client);

/* если работают процессы-клиенты, то надо ждать их завершения */

P(start);     if cl ≠ 0 then (V(start); go to L;);     of: = of + l;      if of = 1 then P(oficiant); V(start);     ... производится чтение ... P(start);     of: = of - 1;     if of = 0 then V(oficiant); V(start); }