Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
спо_отчет_лаб4.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
104.44 Кб
Скачать

Возвращаемые значения

Если функция выполнилась успешно, возвращается хендл мутекса. Если именованный мутекс уже существовал, функция возвращает его хендл и GetLastError возвращаетERROR_ALREADY_EXISTS. В противном случае, создается новый мутекс.

Если функция выполнилась неуспешно, то возвращается NULL. Для получения более подробной информации об ошибке используйте GetLastError.

Примечания

Хендл, возвращаемый CreateMutex, имеет доступ MUTEX_ALL_ACCESS к новому мутексу и может быть использован в любой функции, которая требует хендл мутекса.

Каждый поток вызвавшего процесса может задавать хендл мутекса при вызове функций ожидания (например, WaitForSingleObject). Функции ожидания отдельного объекта завершаются, когда состояние заданного объекта установлено в « signaled ». Для функций ожидания нескольких объектов можно указать, ожидать установления в «signaled» одного из нескольких объектов либо всех объектов. Когда функция ожидания завершается, ожидающий поток продолжает свое выполнение.

Состояние мутекса «signaled», когда им не владеет ни один поток. Создавший мутекс поток может использовать флаг bInitialOwner для запроса немедленного захвата мутекса. В противном случае поток должен использовать одну из функций ожидания для захвата мутекса. Когда состояние мутекса «signaled», один ожидающий поток захватывает его, состояние мутекса изменяется на «nonsignaled», и функция ожидания завершается. Только один поток может владеть мутексом в заданный момент. Поток-владелец использует функцию ReleaseMutex для освобождения мутекса.

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

Два или более процесса могут вызывать CreateMutex, чтобы создать один именованный мутекс. Первый процесс действительно создает мутекс, а последующие процессы открывают хендлы существующего мутекса. Это позволяет нескольким процессам получать хендлы одного мутекса независимо от порядка запуска использующих его процессов.

Используйте функцию CloseHandle для закрытия хендла мутекса. Система автоматически закрывает хендл, когда процесс завершается. Объект мутекса уничтожается, когда закрывается его последний хендл.

WaitForSingleObject

Функция WaitForSingleObject завершается, когда выполняется одно из событий:

  • Заданный объект находится в состоянии «signaled».

  • Истекает таймаут.

DWORD WaitForSingleObject(

  HANDLE hHandle,        // хендл объекта, который надо ждать

  DWORD dwMilliseconds   // таймаут в миллисекундах

);

Параметры

hHandle

Хендл объекта.

dwMilliseconds

Задает длительность таймаута в миллисекундах. Функция завершается по истечении таймаута, даже если объект находится в состоянии «nonsignaled». Если  dwMilliseconds равен 0, функция проверяет состояние объекта и немедленно завершается. Если dwMilliseconds равен INFINITE, функция работает без таймаута.