Page 52 - 4868
P. 52
Ошибка! Стиль не определен. 50
неподільна. Таким чином, < S; > Має той же ефект, що і S. Для задання
тільки умовної синхронізації оператор await може бути скорочений
наступним чином:
<await (В);>
Наприклад, наступним оператором, виконання процесу відкладається до
моменту, коли значення змінної count стане додатним.
<await (count> 0);>
Якщо вираз В задовольняє умові «не більше одного», як в даному
прикладі, то вираз < await (В); > може бути реалізований як:
while (not В);
Це приклад так званого циклу очікування (spin loop). Тіло оператора
while порожнє, оскільки він повинен виконуватися до того часу, доки
значення змінної В не стане «хиба».
Безумовна неподільна дія – це дія, яка не містить в тілі умови затримки
B. Така дія може бути виконана миттєво, у відповідності до вимоги
неподільності її виконання. Безумовними неподільними діями виступають
апаратно реалізовані (дрібномодульні) дії, вирази в кутових дужках і
оператори await в яких умова опущена або є константою «істина».
Умовна неподільна дія – це оператор awaitз умовою B. Така дія не може
бути виконана до того, поки змінна B не набуде мати значення «істина».
Якщо змінна B має значення «хиба», то вона може набути значення «істина»
тільки в результаті дій інших процесів. Таким чином, процес, що очікує
виконання умовної неподільної дії, може виявитися «замороженим» на
необмежену кількість часу.
7.3. Синхронізація типу «виробник-споживач»
В задачі пошуку шаблонів у файлі використані «процес-виробник» і
«процес-споживач». «Виробник» постійно зчитує рядок вводу, визначає, які з
них задовольняють шуканому шаблону, і передає їх «процесу-споживачу».
Потім «споживач» виводить рядки, отримані від «виробника». Взаємодія між
виробником і споживачем забезпечується за допомогою спільної змінної
buffer. Проте, у попередньому прикладі не було визначено методу
синхронізації доступу до буфера.
Вирішимо більш просту задачу типу «виробник-споживач», яка полягає
у копіюванні всіх елементів масиву від «виробника» до «споживача».
Дано два процеси: Producer (виробник) і Consumer (споживач). Процес
Producer визначає локальний масив цілих чисел a[n], а Consumer – масив
цілих чисел b[n]. Передбачається, що масив a є ініціалізованим. Ціль
полягає у копіюванні його вмісту в масив b. Оскільки процеси не розділяють
масиви, то для їх взаємодії потрібні спільні змінні. Нехай змінна buf – це
одинична цілочисельна спільна змінна, яка виконує роль буфера для
взаємодії процесів.