Page 50 - 4868
P. 50

Ошибка! Стиль не определен.                                                                48

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

                     int x = 0, y = 0;
                     cox = 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. Задання синхронізації через оператор очікування

                     Можлива ситуація, коли вираз або оператор присвоєння не задовольняє
               умові  «не  більше  одного»,  проте  необхідно  виконати  його  як  неподільний.
               Більш  загальний  випадок  –  це  коли  в  одній  неподільній  дії  необхідно
               виконати  певну  послідовність  операторів.  У  будь-якому  із  цих  випадків
               потрібен  механізм  синхронізації,  що  дозволив  би  задати  крупномодульну
               неподільну дію, тобто послідовність дрібномодульних неподільних операцій,
               яка виглядає як неподільна.
                     Як конкретний приклад уявімо, що база даних містить два значення x та
               y, які завжди повинні бути однакові, тобто жоден процес, що використовує
               базу  даних,  не  повинен  бачити  стан,  в  якому  x  та  y  мають  різні  значення.
               Отже,  якщо  процес  змінює  значення  x,  то  він  повинен  в  тій  же  самій
               неподільній дії змінити також і значення y.
                     Ще  один  приклад,  нехай  один  процес  додає  елементи  в  чергу,
               представлену зв’язаним списком. Інший процес видаляє елементи із списку
               за умови, що вони там є. Одна змінна вказує на початок списку, а інша – на
               його кінець. Вставка і видалення елементів вимагають обробки двох значень.
               Наприклад, для вставки елемента потрібно змінити посилання на початок та
   45   46   47   48   49   50   51   52   53   54   55