Задача+о+спящем+брадобрее.

Имеется парикмахерская с двумя дверями и несколькими креслами. Посетители входят в одну дверь и выходят через другую. Парикмахер всю жизнь обслуживает клиентов. Когда клиентов нет, он спит в своем кресле. Когда посетитель приходит в салон и видит спящего парикмахера, он будит его, садится в кресло и спит, пока тот занят стрижкой. Если во время стрижки приходит еще один клиент, он садится в одно из свободных кресел и засыпает. Если свободных мест нет, клиент уходит. После стрижки парикмахер открывает клиенту выходную дверь и закрывает ее за ним. Если есть ожидающие посетители, парикмахер будит одного из них и ждет, пока тот сядет в кресло, после чего стрижет его. Если посетителей нет, парикмахер идет спать до следующего клиента. Таким образом, эта задача описывает отношения в системах «клиент-сервер», когда клиент посылает запрос и ждет ответа сервера. В свою очередь сервер ожидает запросы клиентов, обрабатывает их и посылает ответ. Множество запросов клиентов образуют очередь, длина которой ограничена. Если есть свободные стулья, клиенты садятся в очередь. Нет свободных стульев – уходят.

//** semaphore **** clients **** = 0; **//**количество ожидающих клинтов** //** semaphore **** mutex **** = 1; **//**для защищенного доступа к переменной** ** waiting **
 * # **** define **** CHAIRS **** 5 //Количество стульев для клинтов// **
 * semaphore **** barbers **** = 0; //количество готовых к работе брадобреев// **
 * int **** waiting **** = 0; //кол-во занятых стульев с ожидлающими клиентами// **

//** void **** Barber **** { **// //** while **** ( **** TRUE **** ) { **// //** down **** (& **** customers **** ); **//**спать, пока не появится ожидающий клиент** //** waiting **** -= 1; **//**занятых стульев стало меньше** //** up **** (& **** mutex **** ); **//**отпустить доступ к** ** waiting ** //** } **// //** } **//
 * down **** (& **** mutex **** ); //захватить доступ к// **//** waiting **//
 * up **** (& **** barbers **** ); //работающих брадобреев становится больше// **
 * DoWork **** ; //стричь// **

//** void **** Client **** { **// //** down **** ($ **** mutex **** ); **//**захватить доступ к** ** waiting ** //** waiting **** += 1; **//**занятых стульев стало больше** //** down **** ($ **** barbers **** ); **//**занять одного брадобрея** //** } **// //** else **** { **// //** up **** (& **** mutex **** ); **//**нет свободных стульев – уходим отсюда**
 * if **** ( **** waiting **** < **** CHAIRS **** ) { //есть ли свободные стулья?// **
 * up **** ($ **** customers **** ); //ждущих клиентов стало больше; если брадобрей спал, ..// **
 * .. то проснется**
 * up **** ($ **** mutex **** ); //отпустить доступ к// **//** waiting **//
 * GetWork **** ; //принять обслуживание// **
 * } **
 * } **


 * @http://konstantinos777.narod.ru/11_20.htm **

http://konstantinos777.narod.ru/11_20.htm