Page 67 - 4868
P. 67
65 Ошибка! Стиль не определен.
Використовуючи змінну lock замість in1 та in2, можна реалізувати
протоколи входу і виходу в програмі з лістингу 1.3 так, як це показано в
лістингу 1.4.
Перевага протоколів входу і виходу, показаних в лістингу 1.4, по
відношенню до протоколів з лістингу 1.3 полягає в тому, що їх можна
використовувати для вирішення задачі критичної секції при будь-якому числі
процесів.Всі вони будуть поділяти спільну змінну lock і виконувати одні і ті
ж протоколи.
Лістинг 1.4– Критичні секції на основі блокувань
bool lock = false;
process CS1 {
while (true) {
<await (!lock) lock = true;> /* вхід */
критична секція;
lock = false;/* вихід */
некритична секція;
}
}
process CS2 {
while (true) {
< await (!lock) lock = true;> /* вхід */
критична секція;
lock = false;/* вихід */
некритична секція;
}
}
10.3. Інструкції реалізації умовних неподільних дій
Використання змінної lock замість in1 та in2, показане в лістингу 1.4,
є дуже важливим, оскільки майже усі обчислювальні машини, особливо
мультипроцесори, мають спеціальну інструкцію для реалізації умовних
неподільних дій.
Інструкція «перевірити-встановити» (test and set – TS) в якості
аргументу отримує спільну змінну lock і повертає логічне значення.У
неподільній дії інструкція TS зчитує і зберігає значення змінної lock,
присвоює їй значення «істина», а потім повертає збережене попереднє
значення змінної lock.Результат дії інструкції TS описується наступною
функцією:
bool TS(bool lock) {
<bool initial = lock;/* зберегти початкове значення */
lock = true;/* встановити lock */
return initial;> /* повернути початкове значення */