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  –  це
               одинична  цілочисельна  спільна  змінна,  яка  виконує  роль  буфера  для
               взаємодії процесів.
   47   48   49   50   51   52   53   54   55   56   57