Page 62 - 6571
P. 62

Оператор await є досить потужним, оскільки може бути ви-
                  користаний для визначення будь-яких крупномодульних неподі-
                  льних дій. Це робить його дуже зручним для забезпечення проце-
                  су  синхронізації.  Разом  з  тим,  виразна  потужність  оператора

                  await робить дуже «дорогою» його реалізацію в загальній формі.
                  Проте існує досить багато прикладів оператора await, що допус-

                  кають  його  ефективну  реалізацію.  Наприклад,  останній  наведе-
                  ний вище оператор await є окремим випадком операції P над се-
                  мафором S.

                        Загальна форма оператора await визначає як взаємне виклю-
                  чення, так і синхронізацію за умовою. Для визначення тільки вза-
                  ємного  виключення  можна  використовувати  скорочену  форму

                  оператора await:
                        < S;>


                        Наприклад,  в  наступному  операторі  значення  x  та  y  збіль-
                  шуються в неподільній дії:

                        <x = x+1; y = y+1;>

                        Проміжний стан, в якому змінна x була збільшена на одини-
                  цю, а y – ще ні, за визначенням не буде видимим для інших про-
                  цесів, що посилаються на змінні x або y. Якщо послідовність S –

                  це  одиничний  оператор  присвоєння,  що  задовольняє  умові  «не
                  більше  одного»,  або  якщо  послідовність  S  реалізована  однією

                  машинної інструкцією, то вона буде виконана як неподільна. Та-
                  ким чином, < S; > Має той же ефект, що і S. Для задання тільки
                  умовної синхронізації оператор await може бути скорочений на-
                  ступним чином:

                        <await (В);>

                        Наприклад, наступним оператором, виконання процесу відк-

                  ладається до моменту, коли значення змінної count стане додат-
                  ним.

                        <await (count> 0);>

                        Якщо вираз В задовольняє умові «не більше одного», як в да-
                  ному прикладі, то вираз < await (В); > може бути реалізова-

                  ний як:
                        while (not В);



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