Типовые задачи синхронизации. Взаимное исключение

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

В каждом конкретном случае синхронизация задаётся с помощью синхронных правил. Реализация синхронизирующих правил осуществляется с помощью механизмов синхронизации.

Большинство задач синхронизации можно решить с помощью базовых механизмов синхронизации, либо с помощью их модификаций.

Задача взаимного исключения

Необходимо согласовать работу двух или более параллельных процессов при использовании некоторого критического ресурса таким образом, чтобы обеспечить удовлетворённость следующим требованиям:

1) Одновременно внутри критической области должно находиться не более одного процесса

2) Критическая область параллельных процессов не должны иметь приоритетов относительно друг друга

3) Остановка любого процесса вне его критической области не должно влиять на дальнейшее выполнение процесса по использованию критического ресурса.

4) Решение о вхождении процессов в их критическую область при одинаковом времени поступления запросов и равенства приоритетов не должно откладываться и является конечным.

5) Относительная скорость развития процессов независимо от производной

6) Любой процесс может переходить в любое состояние вне пределов своей критической области.

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

Решение задачи взаимного исключения:

В языке предоставлены некоторые вещи для решения задачи взаимного исключения: любой объект, метод или участок кода может быть объявлен со спецификатором synchronized. Участок кода, выделенный таким образом всегда выполняется, по отношению к другим потокам, в режиме взаимного исключения, т. е. Если этот участок вызван потом из потока ни в одном другом потоке этот участок выполняться не будет до момента выхода из него первого потока. Для синхронизации потоков так же можно использовать синхронизирующие операторы, например для метода или объекта можно использовать методы wait() и notify(). Так же могут использоваться семафоры.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: