Мьютекс

Объект ядра взаимное исключение (mutual exception), или мьютекс (mutex), гарантируют потокам взаимоисключающий доступ к ресурсу. По своему поведению мьютекс практически аналогичен критической секциии, но в отличие от последней обеспечивает более универсальную функциональность. Основное отличие заключается в том, что критические секции являются объектами пользовательского режима, а мьютексы – объектами ядра. Таким образом, мьютекс позволяет синхронизировать доступ к ресурсу нескольких потоков из разных процессов. Кроме того мьютекс позволяет задать максимальное время ожидания доступа к ресурсу.

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

HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName

);

Параметр определяет начальное состояние мьютекса. Если данный параметр равен FALSE, созданный мьютекс не принадлежит ни одному из потоков и находится в свободном состоянии. Если же значение равно TRUE, поток сразу же захватывает мьютекс.

Возвращаемое значение функции содержит дескриптор созданного мьютекса. Значение NULL указывает на ошибку при вызове функции.

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

Когда поток, занимающий ресурс, заканчивает с ним работать, необходимо освободить мьютекс вызовом функции ReleaseMutex.

BOOL ReleaseMutex(HANDLE hMutex);

В качестве единственного параметра функция получает дескриптор мьютекса. В случае неуспешного завершения операции, функция возвращает значение FALSE. Данная ситуация может возникнуть, когда мьютекс не принадлежит вызывающему потоку.


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



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