Синхронизация.
Синхронизация возникает в случаях, когда процессы используют общий уникальный ресурс(ы), либо когда несколько процессов работают над достижением одного результата.
1. Критическая секция(часто используемый элемент синхронизации)
Пример: В банке есть счет 100 $. Программист пишет процедуру добавления денег на ваш счет.
void Add$(float delta)
{
float v = Get$();
v = v + delta;
Set$(v);
}
Вдруг процесс А хочет добавить 50$ и одновременно процесс В – 60$:
Потеряны 60$, потому что к Add$() получили доступ процесс А и процесс В параллельно.
Критическая секция – участок кода, который не может выполняться параллельно, т.к., в противном случае, результат его работы не определен.
Чтобы исправить положение добавим в функцию Add$()следующее:
Enter($) – войти в критическую секцию
Leawe($) – выйти из критической секции.
void Add$(float delta)
{
Enter($);
float v = Get$();
v = v + delta;
Set$(v);
Leawe($);
}
2. События.
Фактически логическая переменная, которая отвечает за то, произошел процесс или нет.
Говорят, что событие установлено, если true и сброшено, если false.
Функциональная спецификация:
- установить
- сбросить
- дождаться
Используется, когда надо синхронизировать процессы.
3. Барьер(б)
Используется, когда надо быть уверенным в том, что несколько процессов завершили свое действие.
Функциональная спецификация:
- зарегистрироваться на б
- разрегистрироваться на б
- достигли б
Процессы, достигшие барьер, переводятся в состояние ожидания до тех пор, пока все зарегистрированные на барьере процессы не дойдут до него. В этом случае все процессы переводятся в состояние готовности.