Контрольная работа [вариант 4] / Официанты клиенты
.docДля программирования такого взаимодействия будут использованы три семафорные переменные 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); }