Монітор (синхронізація)Монітор — в мовах програмування, це високорівнева конструкція для отримання ексклюзивного доступу до спільних ресурсів. Монітор реалізується за допомогою м'ютекса та умовних змінних. Монітор був винайдений П.Б. Хансеном[1] та Тоні Гоаром[2] та вперше був застосований в мові Concurrent Pascal. М'ютексМонітор гарантує ексклюзивний доступ до класу, об'єкта чи модуля за допомогою використання м'ютекса. Приклад об'єкта, що гарантує безпечний доступ до банківського рахунку: monitor class Account {
private int balance := 0
invariant balance >= 0
public method boolean withdraw(int amount)
precondition amount >= 0
{
if balance < amount then return false
else { balance := balance - amount ; return true }
}
public method deposit(int amount)
precondition amount >= 0
{
balance := balance + amount
}
}
Під час виконання потоком метода такого об'єкта, кажуть, що потік займає (чи заблоковує) об'єкт, отримуючи його м'ютекс (lock). У кожен конкретний момент часу не більше одного потоку може виконувати код цього об'єкта.
Умовні змінніЯкщо метод монітора має дочекатись деякої умови, що встановлюється методом того самого монітора в іншому потоці, то цей метод повинен:
Така функціональність реалізується за допомогою змінних умови (умовна змінна). Технічно, умовна змінна є списком потоків, що очікують на дану умову. Поки потік очікує на умовну змінну, він не може зайняти монітор. Єдиними операціями можливими над умовною змінною є: очікування та оповіщення. Блокуюча умовна змінна — рання реалізація (реалізація Гоара), що при оповіщенні умовної змінної, негайно активізує потік очікування та віддає йому м'ютекс. Ця реалізація технічно складна, і її єдина перевага в тому, що оповіщений потік може бути впевненим, що умова ще чинна. Неблокуюча умовна змінна — пізніша реалізація (реалізація Mesa) дозволяє потоку, що сповіщає завершити метод монітора, а аж потім пробудити потік очікування. Це реалізація простіша, але вона не гарантує чинності умови в момент пробудження потоку, оскільки умова могла після першої зміни знову змінитись.
Тому, в коді очікування потрібно писати ПоширенняМонітори підтримують мови програмування: Примітки
Посилання
|