Page 63 - 6571
P. 63

Це  приклад  так  званого  циклу  очікування  (spin  loop).  Тіло
            оператора while порожнє, оскільки він повинен виконуватися до
            того часу, доки значення змінної В не стане «хиба».

                  Безумовна неподільна дія – це дія, яка не містить в тілі умови
            затримки B. Така дія може бути виконана миттєво, у відповіднос-
            ті до вимоги неподільності її виконання. Безумовними неподіль-

            ними  діями  виступають  апаратно  реалізовані  (дрібномодульні)
            дії,  вирази  в  кутових  дужках  і  оператори  await  в  яких  умова
            опущена або є константою «істина».
                  Умовна неподільна дія – це оператор await з умовою B. Така

            дія не може бути виконана до того, поки змінна B не набуде мати
            значення «істина». Якщо змінна B має значення «хиба», то вона

            може  набути  значення  «істина»  тільки  в  результаті  дій  інших
            процесів. Таким чином, процес, що очікує виконання умовної не-
            подільної дії, може виявитися «замороженим» на необмежену кі-
            лькість часу.



                  7.3 Синхронізація типу «виробник-споживач»


                  В  задачі  пошуку  шаблонів  у  файлі  використані  «процес-
            виробник» і «процес-споживач». «Виробник» постійно зчитує ря-

            док вводу, визначає, які з них задовольняють шуканому шаблону,
            і  передає  їх  «процесу-споживачу».  Потім  «споживач»  виводить
            рядки,  отримані  від  «виробника».  Взаємодія  між  виробником  і
            споживачем  забезпечується  за  допомогою  спільної  змінної  bu-

            ffer. Проте, у попередньому прикладі не було визначено методу
            синхронізації доступу до буфера.

                  Вирішимо  більш  просту  задачу  типу  «виробник-споживач»,
            яка полягає у копіюванні всіх елементів масиву від «виробника»
            до «споживача».
                  Дано два процеси: Producer (виробник) і Consumer (спожи-

            вач).  Процес  Producer  визначає  локальний  масив  цілих  чисел
            a[n], а Consumer – масив цілих чисел b[n]. Передбачається, що

            масив a є ініціалізованим. Ціль полягає у копіюванні його вмісту
            в масив b. Оскільки процеси не розділяють масиви, то для їх вза-
            ємодії потрібні спільні змінні. Нехай змінна buf – це одинична

            цілочисельна спільна змінна, яка виконує роль буфера для взає-
            модії процесів.


                                                        62
   58   59   60   61   62   63   64   65   66   67   68