Мои Конспекты
Главная | Обратная связь


Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

Пессимистическое управление



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

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

· Блокировать список.

· Найти объект в списке.

· Блокировать объект.

· Разблокировать список.

· Провести действия над объектом.

· Разблокировать объект.

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

Поток может уничтожить объект, реализуя такой алгоритм:

· Блокировать список.

· Блокировать объект.

· Удалить объект из списка.

· Разблокировать список.

· Удалить объект (учитывая возможные ограничения при уничтожении блокированного мьютекса).

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

Мы подошли к интересной части. Поток может сравнить два объекта, выполняя более простой алгоритм, чем приведенные выше:

· Блокировать список.

· Найти в списке первый объект.

· Блокировать первый объект.

· Найти в списке второй объект.

· Блокировать второй объект.

· Разблокировать список.

· Провести сравнение.

· Разблокировать оба объекта (в любом порядке).

Заметьте, что в операции сравнения я не устанавливал никаких ограничений на порядок, в котором осуществляется блокировка объектов. Не приведет ли это к тупику? Приведенным алгоритмам не нужно следовать никаким критериям, представленным в начале этой главы, чтобы избежать тупика, но все-таки он не случится. Этого не происходит, поскольку когда поток блокирует мьютекс объекта, он уже владеет мьютексом списка, и, таким образом, блокирует несколько объектов, не освобождая мьютексы списка, так что составная блокировка нескольких объектов становится атомарной. В результате мы можем пересмотреть вышеуказаные критерии:

· Зацикливание не произойдет, если потоки, которые пытаются захватить некоторый мьютекс Mx, в этот момент не владеют никакими мьютексами "более высокого приоритета", т.е., M(x+1) ... Mn.

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




Поиск по сайту:







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.