Операционные системы. Программирование в операционной среде Windows

40 доступ к ресурсу нескольких потоков из одного или разных процессов, а также ограничить время ожидания ресурса. Идентификатор потока определяет, какой поток захватил мьютекс, а счетчик рекурсий — сколько раз. Если идентификатор потока равен О, то мьютекс не захвачен и находится в свободном состоянии; Мьютексы наиболее часто используемые ОЯ, с их помощью защищают блок памяти, к которому обращается множество потоков. Мьютексы гарантируют, что любой поток получает монопольный доступ к блоку памяти, и тем самым обеспечивают целостность данных. Для использования объекта-мьютекса один из процессов должен создать его вызовом функции CreateMutex: HANDLE CreateMutex(PSECURITY_ATTRIBUTES psa, BOOL fInitialOwner, PCTSTR pszName); В параметре psa задается указатель на атрибуты защиты ОЯ. Параметр flnitialOwner определяет начальное состояние мъютекса, если в нем передается FALSE, то объект-мьютекс находится в свободном состоянии. При этом его идентификатор потока и счетчик рекурсии равны 0. Если же в нем передается TRUE, идентификатор потока, принадлежащий мьютексу, приравнивается идентификатору вызывающего потока, а счетчик рекурсии получает значение 1. Тогда ОЯ «мьютекс» изначально находится в занятом состоянии. В параметре pszName можно передать адрес строки с именем ОЯ, а при передаче в нем значения NULL, создается безымянный ОЯ. Любой процесс может получить свой описатель существующего ОЯ «мьютекс», вызвав функцию OpenMutex. HANDLE OpenMutex(DWORD fdwAccess, BOOL binheritHandle, PCTSTR pszName); Поток получает доступ к разделяемому ресурсу, вызывая одну из Wait- функций и передавая ей описатель мьютекса, который охраняет этот ресурс. Wait-функция проверяет у мьютекса идентификатор потока, если его значение равно О, то мьютекс свободен. Тогда идентификатор потока мьютекса принимает значение идентификатора вызывающего потока, и этот поток остается планируемым. Если Wait-функция определяет, что у мьютекса идентификатор потока не равен О, т.е. мьютекс занят, вызывающий поток переходит в состояние ожидания. Система запоминает это и, когда идентификатор обнуляется, записывает в него идентификатор ждущего потока, а счетчику рекурсии присваивает значение 1, после чего ждущий поток вновь становится планируемым. Для мьютексов сделано исключение в правилах перехода ОЯ из одного состояния в другое. Если объект-мьютекс занят, но идентификатор потока, пытающегося захватить мьютекс, совпадает с идентификатором у мьютекса, то система по-прежнему выделяет потоку процессорное время, хотя мьютекс все еще занят. Значение счетчика рекурсии может быть больше единицы.

RkJQdWJsaXNoZXIy MTY0OTYy