Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОТВЕТЫ ОС ЭКЗАМЕН.docx.doc
Скачиваний:
2
Добавлен:
16.09.2019
Размер:
185.86 Кб
Скачать

25) Использование Mutex для синхронизации. Функции.

Мьютексы (mutex) — это один из вариантов семафорных механизмов для организации взаимного исключения. Они реализованы во многих ОС, их основное назначение — организация взаимного исключения для потоков из одного и того же или из разных процессов.

Мьютексы — это простейшие двоичные семафоры, которые могут находиться в одном из двух состояний — отмеченном или неотмеченном (открыт и закрыт соответственно). Когда какой-либо поток, принадлежащий любому процессу, становится владельцем объекта mutex, последний переводится в неотмеченное состояние. Если задача освобождает мьютекс, его состояние становится отмеченным.

Организация последовательного доступа к ресурсам с использованием мьютексов становится несложной, поскольку в каждый конкретный момент только один поток может владеть этим объектом. Для того, чтобы мьютекс стал доступен потокам, принадлежащим разным процессам, при создании ему необходимо присвоить имя. Потом это имя нужно передать «по наследству» задачам, которые должны его использовать для взаимодействия. Для этого вводятся специальные системные вызовы (CreateMutex), в которых указывается начальное значение мьютекса и имя.

Для работы с мьютексом имеется несколько функций. Помимо уже упомянутой функции создания такого объекта (CreateMutex), есть функции открытия (OpenMutex) и функция освобождения этого объекта (ReleaseMutex). Единственная задача мьютекса — защита объекта от доступа к нему других потоков, отличных от того, который завладел мьютексом. Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток просто засыпает до тех пор, пока мьютекс не будет освобождён.

Цель использования мьютексов — защита данных от повреждения; однако им порождаются другие проблемы, такие как взаимная блокировка (клинч) и «соревнование за ресурс».

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

ReleaseMutex() - используется для освобождения мьютекса, если он больше не нужен

Wait ForSingleObject( HANDLE hHandle (дескриптор процесса), DWORD dwMilliseconds (сколько времени необходимо ждать завершения прилож-я, если нужно ждать сколько придется – задается константа INFINITE). Используется, как проверка завершенности процесса. Возвращает WAIT_Object_0 - процесс завершен или WAIT_TIMEOUT – прошел заданный промежуток времени.

CreateMutex (

lpMutexAttributes //LpSecurityDescriptor член структуры определяет дескриптор безопасности для нового мьютекса. Если lpMutexAttributes является NULL, мьютекс получает дескриптор безопасности по умолчанию. 

bInitialOwner //Если это значение TRUE и вызывающий создал мьютекс, вызывающий поток получает первоначальные права собственности на объект мьютекса. В противном случае, вызывающий поток не получить право собственности на мьютекс. 

lpName //Имя мьютекса объекта. 

BOOL WINAPI CloseHandle(

HANDLE hObject //Дескриптор открытого объекта )