Page 60 - 6571
P. 60

Обидва присвоєння в наступній програмі також задовольня-
                  ють умові «не більше одного».

                        int x = 0, y = 0;
                        co x = y+1; // y = y+1; oc;

                        Перший процес посилається на змінну y (одне критичне по-
                  силання), але змінна x не зчитується другим процесом, і в друго-
                  му процесі немає критичних посилань. Кінцевим значенням змін-

                  ної x буде або 1, або 2, а кінцевим значенням змінної y буде 1.
                  Перший процес зчитає змінну y або перед її приростом, або після,

                  але в паралельній програмі ніколи не відомо, який стан змінної
                  він  побачить  (проміжний,  чи  кінцевий),  оскільки  порядок  вико-
                  нання програми не є детермінований.
                        У наступному прикладі жодне присвоєння не відповідає умо-

                  ві «не більше одного».

                        int x = 0, y = 0;
                        co x = y+1; // y = x+1; oc;

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

                  жуть бути 1 і 2, 2 і 1, або навіть 1 і 1 (якщо процеси зчитують
                  значення змінних x та y до присвоєння їм значень). Однак, оскі-
                  льки кожне присвоєння посилається лише один раз і лише на од-

                  ну змінну, змінювану іншим процесом, кінцевими будуть ті зна-
                  чення, які дійсно існували в деякому стані. Це відрізняється від
                  прикладу, наведеного раніше, в якому вираз y + z посилався на

                  дві змінні, значення яких змінювалися іншим процесом.


                        7.2 Задання синхронізації через оператор очікування


                        Можлива  ситуація,  коли  вираз  або  оператор  присвоєння  не
                  задовольняє умові «не більше одного», проте необхідно виконати

                  його як неподільний. Більш загальний випадок – це коли в одній
                  неподільній дії необхідно виконати певну послідовність операто-
                  рів. У будь-якому із цих випадків потрібен механізм синхроніза-

                  ції, що дозволив би задати крупномодульну неподільну дію, тобто
                  послідовність дрібномодульних неподільних операцій, яка вигля-
                  дає як неподільна.



                                                              59
   55   56   57   58   59   60   61   62   63   64   65