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