Page 83 - 6571
P. 83
вертає збережене попереднє значення змінної lock. Результат дії
інструкції TS описується наступною функцією:
bool TS(bool lock) {
<bool initial = lock;/* зберегти початкове значення
*/
lock = true;/* встановити lock */
return initial;> /* повернути початкове значення */
}
Використовуючи інструкцію TS, можна реалізувати крупно-
модульний варіант програми з лістингу 4 за алгоритмом, наведе-
ним в лістингу 5. Умовні неподільні дії в програмі з лістингу 4
замінюються відповідними циклами. Цикли не закінчуються, до-
ки змінна lock не набуде значення «хиба», тобто інструкція TS
повертає значення «хиба». Оскільки всі процеси виконують одні і
ті ж протоколи, наведене рішення працює незалежно від числа
процесів. Використання блокуючої змінної, як це показано в ліс-
тингу 5, зазвичай називається циклічним блокуванням (spin lock),
оскільки процес постійно повторює цикл, очікуючи при цьому
зняття блокування.
Лістинг 5 – Критичні секції на основі інструкції «перевірити-
встановити»
bool lock = false;/* спільна змінна */
process CS[i = 1 to n] {
while (true) {
while (TS(lock)) skip;/* протокол входу */
критична секція;
lock = false;/* протокол виходу */
некритична секція;
}
}
Рішення задачі критичної секції, аналогічне наведеному в лі-
стингу 5, може бути реалізовано на будь-якій машині, якщо у неї
є інструкція, що перевіряє і змінює спільну змінну в одній непо-
дільній дії. Наприклад, у деяких машинах є інструкція інкременту
(нарощення), яка збільшує значення цілочисельної змінної і ви-
значає умову, що використовується для досягнення позитивного
значення цієї змінної. Використовуючи дану інструкцію, є мож-
82