Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ТВП ЛР A5.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
611.84 Кб
Скачать

Объекты – событие с автосбросом

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

7.3. Объекты Mutex

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

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

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

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

Создание объекта Mutex

Для создания объекта Mutex вы должны использовать функцию CreateMutex, прототип которой мы привели ниже:

HANDLE CreateMutex(

LPSECURITY_ATTRIBUTES lpSecurityAttributes

// атрибуты защиты

BOOL bInitialOwner

// начальное состояние

LPCTSTR IpName);

// имя объекта Mutex

В качестве первого параметра (атрибуты защиты) вы можете указать значение NULL.

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

Через параметр IpName вы должны передать указатель на имя объекта Mutex. Это имя не должно содержать символ "\" и его длина не должна превышать значение МАХ_РАТН.

Если объект Mutex будет использован только задачами одного процесса, вместо адреса имени можно указать значение NULL. В этом случае будет создан "безымянный" объект Mutex.

Функция CreateMutex возвращает идентификатор созданного объекта Mutex или NULL при ошибке.

Возможно возникновение такой ситуации, когда приложение пытается создать объект Mutex с именем, которое уже используется в системе другим объектом Mutex. В этом случае функция CreateMutex вернет идентификатор существующего объекта Mutex, а функция GetLastError, вызванная сразу после вызова функции CreateMutex, вернет значение ERROR_ALREADY_EXISTS. Заметим, что функция создания объектов-событий CreateEvent ведет себя в данной ситуации аналогичным образом.