Синхронизация.

Синхронизация возникает в случаях, когда процессы используют общий уникальный ресурс(ы), либо когда несколько процессов работают над достижением одного результата.

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. Барьер(б)

Используется, когда надо быть уверенным в том, что несколько процессов завершили свое действие.

Функциональная спецификация:

- зарегистрироваться на б

- разрегистрироваться на б

- достигли б

Процессы, достигшие барьер, переводятся в состояние ожидания до тех пор, пока все зарегистрированные на барьере процессы не дойдут до него. В этом случае все процессы переводятся в состояние готовности.