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