Page 150 - 6571
P. 150

між значеннями лічильників, то безмежного зростання можна бу-
                  ло  б  уникнути.  У  описаній  задачі  можна  виділити  три  ключові
                  змінні з іменами barber, chair та open.

                        barber == bavail – cinchair;
                        chair == cinchair – bbusy;
                        open == bdone – cleave;

                        Вони ініціалізуються нульовими значеннями, а під час робо-
                  ти програми можуть приймати значення 0 або 1. Значення змін-

                  ної barber рівне 1, якщо перукар очікує відвідувача і сидить у
                  своєму кріслі. Змінна chair має значення 1, якщо відвідувач вже

                  сів  у  крісло,  але  перукар  ще  не  почав  стрижку,  а  змінна  open
                  приймає значення 1, якщо двері для виходу вже відчинені, але ві-
                  двідувач ще не вийшов.

                        Використаємо описані вище умовні змінні для реалізації не-
                  обхідної синхронізації між перукарем та відвідувачами. Існують
                  чотири  умови  синхронізації:  1)  відвідувачі  очікують  звільнення

                  перукаря; 2) відвідувачі очікують, коли перукар відкриє двері; 3)
                  перукар очікує приходу відвідувача; 4) перукар очікує, коли від-
                  відувач покине перукарню. Для представлення даних умов необ-
                  хідно чотири умовні змінні. Процеси очікують виконання умов за

                  допомогою операторів wait, що знаходяться в циклах. У момент,
                  коли умови задовольняють істині, процеси виконують операцію
                  signal. Повне рішення задачі про сплячого перукаря представ-

                  лено в лістингу 30.

                        Лістинг  30  –  Реалізація  монітора  для  задачі  про  сплячого
                  перукаря

                        monitor Barber_Shop {
                          int barber = 0, chair = 0, open = 0;
                          cond barber_available; # отримує сигнал, коли
                               barber > 0
                          cond chair_occupied; # отримує сигнал, коли chair > 0
                          cond door_open; # отримує сигнал, коли open > 0

                          cond customer_left; # отримує сигнал, коли open == 0
                          procedure get_haircut() {
                            while (barber == 0) wait(barber_available);
                            barber = barber-1;
                            chair = chair+1;
                            signal(chair_occupied);

                                                             149
   145   146   147   148   149   150   151   152   153   154   155