Исключающие семафоры (mutex)

Предотвращение условия циклического ожидания

Предотвращение условия отсутствия принудительной выгрузки ресурса

Предотвращение условия удержания и ожидания

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

Можно выгружать ресурсы, но могут быть проблемы с принтером.

Способы предотвращения:

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

− Можно пронумеровать все ресурсы (и упорядочить), и процессы должны запрашивать ресурсы только по порядку.


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

Составное слово "mutex" происходит из словосочетания "mutual exclusion", что означает взаимное исключение, и очень точно отражает назначение объектов. Мы хотим предотвратить возможность прерывания потока в программе до тех пор, пока не будет выполнено обновление или использование разделяемых данных.

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

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

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

Если поток является владельцем Mutex, он обладает правом эксклюзивного использования ресурса, который защищается этим Mutex'ом. Ни один другой поток не может завладеть Mutex'ом, который уже принадлежит одному из потоков.

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

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

Для мьютексов определены следующие правила:

– создание объекта Mutex;

– если его идентификатор потока равен 0 (у самого потока не может быть та кой идентификатор), мьютекс не захвачен ни одним из потоков и находится в свободном состоянии;

– если его идентификатор потока не равен 0, мьютекс захвачен одним из потоков и находится в занятом состоянии;

– в отличие от других объектов ядра мьютексы могут нарушать обычные правила, действующие в операционной системе

При работе с Mutex выполняются следующие действия:

- создание объекта Mutex;

- освобождение идентификатора объекта Mutex;

- открытие существующего Mutex;

- овладевание объектом Mutex;

- освобождение объекта Mutex.

Таким образом, проводя аналогию с критическими разделами, освобождение объекта Mutex соответствует выходу из критического раздела.


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



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