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

4.2 Мьютексы

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

Мьютекс аналогичен объекту КС, но, в дополнение к возможности разделения процессами, мьютексы позволяют использовать тайм-аут и переходят в сигнальное состояние, когда процесс завершается и оставляет мьютекс. Поток вступает во владе­ние мьютексом (или "блокирует" мьютекс), выполняя ожидание для дескриптора мьютекса (функции WaitForSingleObject или WaitForMultipleObjects), и осво­бождает его функцией ReleaseMutex.

Поток может получать определенный мьютекс несколько раз; он не бу­дет блокировать мьютекс, если уже владеет им. В конечном счете поток должен столько же раз и освободить мьютекс.

Для работы с мьютексами используются функции Win32 CreateMutex, Release­Mutex и OpenMutex.

HANDLE CreateMutex ( LPSECURITY_ATTRIBUTES lpsa,

BOOL fInitialOwner, LPCTSTR lpszMutexName)

Значение TRUE флага fInitialOwner позволяет вызывающему функцию потоку немедленно вступить во владение новым мьютексом. Эта элементарная операция за­щищает другие потоки от захвата владения мьютексом до того, как это сделает соз­дающий его поток. Как видно из имени, этот флаг игнорируется, если мьютекс уже существует.

Параметр lpszMutexName определяет имя мьютекса, которое, в отличие от имен файлов, чувствительно к регистру символов. Если это параметр имеет значение NULL, мьютекс будет безымянным. События, мьютексы, семафоры, объекты отображения файлов разделяют одно пространство имен. Поэтому все объекты синхронизации должны иметь разные имена. Имя ограничивается длиной в 260 символов.

Возвращенное значение NULL сообщает об ошибке.

Функция OpenMutex используется для открытия существующего именованного мьютекса. Она позволяет потокам разных процессов синхронизироваться так, как будто они принадлежат одному процессу. Создание мьютекса одним процессом должно предше­ствовать открытию его другим. Семафоры, события, отображения файлов также имеют функции создания и открытия. Всегда предполагается, что один про­цесс, например сервер, сначала выполняет функцию Create для создания именован­ного объекта, а другой процесс вызывает функцию Open, которая приводит к сбою, если данный именованный объект еще не создан. Если же порядок не имеет значе­ния, все процессы могут использовать вызов функции Create.

Функция ReleaseMutex освобождает мьютекс, которым владеет вызывающий по­ток. Если поток не владеет данным мьютексом, функция не выполняется.

BOOL ReleaseMutex (HANDLE hMutex)

Покинутые мьютексы

Если поток завершается, не освободив мьютекс, которым он владеет, мьютекс ста­новится покинутым, а его дескриптор переходит в сигнальное состояние. Функция WaitForSingleObject возвратит значение WAIT_ABANDONED_0, а функция WaitForMultipleObjects использует значение WAIT_ABANDONED_0 как базовое для того, что­бы сообщить, что дескрипторы в сигнальном состоянии представляют покинутые мьютексы.

Переход дескрипторов покинутых мьютексов в сигнальное состояние — очень удобное свойство, недоступное для КС. Появление покинутых мьютексов говорит о том, что в коде, возможно, есть ошибки, так как потоки должны программироваться таким образом, чтобы отдавать ресурсы перед завершением. Возможно также, что по­ток был завершен другим потоком.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]