Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
Мьютексы
Для решения проблемы взаимного исключения между параллельными потоками, которые выполняются в контекстах разных процессов, в Windows используется объект ядра системы с названием Mutex. Мьютекс находится в сигнальном, то есть свободном состоянии, если он не принадлежит ни одному потоку. В противном случае, мьютекс находится в несигнальном, занятом, состоянии. Это состояние говорит о том, что один из потоков использует разделяемый ресурс. Одновременно, мьютекс может принадлежать только одному потоку. Остальные потоки находятся в состоянии ожидания освобождения мьютекса, то есть перехода его в сигнальное состояние. Все эти потоки обслуживаются в порядке дисциплины FIFO, то есть они становятся в очередь к мьютексу, и выбираются из очереди в соответствии с этой дисциплиной. Но в том случае, если какой-либо поток ожидает наступления некоторого асинхронного события, то есть внешнего по отношению к системе, то функции ядра системы могут исключить поток из очереди к мьютексу для обслуживания этого события. После этого, поток снова становится в очередь к мьютексу, но в её конец. Мьютекс создается вызовом в потоке функции CreateMutex, которая имеет следующий формат: CreateMutex (p1, p2, p3); · p1 – атрибуты защиты объекта; · p2 – начальный владелец; · p3 – имя мьютекса. При установке p1 в NULL атрибуты защиты устанавливаются по умолчанию. В этом случае, дескриптор мьютекса не наследуется в других потоках и открыт для них. Если p2 == true, то мьютекс сразу переходит во владение того потока, в котором был создан. Такой поток имеет все права доступа к мьютексу. Если p2 == false, то созданный мьютекс свободен. Значение p3 задает уникальное имя мьютекса для всех процессов, выполняющихся под управлением ОС, то есть имя мьютекса как объекта является общесистемной характеристикой. Оно позволяет обращаться к мьютексу из других процессов, запущенных в текущем сеансе работы ОС. Длина имени не должна превышать некоторого максимального значения, устанавливаемого в системе. Значением p3 может быть пустой указатель. В этом случае создается безымянный мьютекс. В случае удачного завершения функция CreateMutex возвращает дескриптор созданного объекта, который может использоваться в других функциях. При неудаче возвращается ноль. Если мьютекс с заданным в p3 именем уже существует, то функция CreateMutex возвращает дескриптор уже созданного мьютекса, а функция GetLastError, вызванная после функции CreateMutex, возвращает значение ошибки в виде именованной константы ERROR_ALREADY_EXISTS. Мьютекс захватывается потоком, если он свободен, с помощью любой функции ожидания, и освобождается функцией ReleaseMutex(Handle). В случае успешного завершения эта функция возвращает ненулевое значение, а в случае неудач возвращает ноль. Если поток освобождает мьютекс, которым он не владеет, то данная функция также возвращает ноль. Для доступа к уже существующему мьютексу поток может использовать одну из двух функций: · CreateMutex (p1,p2,p3); · OpenMutex (); CreateMutex используется, если поток не имеет информации о том, создан, или нет, мьютекс с таким же именем в другом потоке. В этом случае, p2 нужно задавать как false, поскольку невозможно определить, какой из потоков создает мьютекс. При использовании для доступа к уже созданному мьютексу CreateMutex, поток получает полный доступ к мьютексу. Чтобы получить доступ к уже созданному мьютексу, может использоваться OpenMutex (po1, po2, po3); · po1 – вид доступа к мьютексу; · po2 – определяет свойства наследования мьютекса; · po3 – имя мьютекса. po1 может иметь два значения: 1) полный доступ к мьютексу; 2) синхронизация. В этом случае, поток может использовать мьютекс только в функциях ожидания, чтобы захватить его, или в функции ReleaseMutex, чтобы освободить его. Если po2 имеет значение истины, то дескриптор открываемого мьютекса является наследуемым в других дочерних потоках. В случае успешного завершения, функция OpenMutex возвращает дескриптор открытого мьютекса, а в противном случае – ноль.
Дата добавления: 2014-10-10; просмотров: 314; Нарушение авторских прав Мы поможем в написании ваших работ! |