
- •1.1 Основы программирования в операционной системе Windows
- •1.1.1 Вызов функций api
- •1.1.2 Структура программы
- •1.2 Вопросы системного программирования в Windows
- •1.2.1 Страничная и сегментная адресация.
- •1.2.2 Адресное пространство процесса.
- •2.1 Управление процессами
- •2.2 Процессы и потоки в Windows
- •2.3 Создание процессов
- •2.4 Определение исполняемого образа и командной строки
- •2.5 Идентификация процессов
- •3.1 Создание потока. Функция CreateThread
- •3.2. Завершение потока
- •3.3 Другие функции работы с потоками
- •3.4 Структура context
- •3.5 Приоритеты потоков
- •4.1 Объект critical_section
- •4.2 Мьютексы
- •4.3 Семафоры
- •5.1 События
- •7.1 Кучи
- •7.2 Управление памятью кучи
- •Другие функции для работы с кучей
- •Резюме по управлению кучей
- •Отображение адресного пространства процесса в объекты отображения
- •Что такое импорт
- •Явная загрузка dll
- •Явное подключение экспортируемого идентификатора
- •10.1 Управление файлами и каталогами Создание и открытие файлов
- •10.2 Управление каталогами
- •10.3 Другие методы получения атрибутов файлов и каталогов
- •11.1 Блокировка файлов
- •11.2 Реестр
- •12.1 Стандартные устройства и консольный ввод-вывод
- •12.2 Асинхронный ввод-вывод и порты завершения
- •Параметры
- •Цели системы безопасности
- •Параметры
- •Аварийное завершение
- •Использование именованных каналов
- •Параметры
- •Наблюдение за сообщениями в именованном канале
- •Параметры
4.2 Мьютексы
Объект мьютекс (от английского mutual exclusion — взаимное исключение) предоставляет более широкие возможности, чем критические секции кода. Мьютексу может быть присвоено имя и дескриптор, поэтому такие объекты могут быть использованы для межпроцессной синхронизации потоков в отдельных процессах. Например, два процесса, разделяющие память отображенного файла, могут использовать мьютексы для синхронизации доступа к разделенной памяти.
Мьютекс аналогичен объекту КС, но, в дополнение к возможности разделения процессами, мьютексы позволяют использовать тайм-аут и переходят в сигнальное состояние, когда процесс завершается и оставляет мьютекс. Поток вступает во владение мьютексом (или "блокирует" мьютекс), выполняя ожидание для дескриптора мьютекса (функции WaitForSingleObject или WaitForMultipleObjects), и освобождает его функцией ReleaseMutex.
Поток может получать определенный мьютекс несколько раз; он не будет блокировать мьютекс, если уже владеет им. В конечном счете поток должен столько же раз и освободить мьютекс.
Для работы с мьютексами используются функции Win32 CreateMutex, ReleaseMutex и 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 как базовое для того, чтобы сообщить, что дескрипторы в сигнальном состоянии представляют покинутые мьютексы.
Переход дескрипторов покинутых мьютексов в сигнальное состояние — очень удобное свойство, недоступное для КС. Появление покинутых мьютексов говорит о том, что в коде, возможно, есть ошибки, так как потоки должны программироваться таким образом, чтобы отдавать ресурсы перед завершением. Возможно также, что поток был завершен другим потоком.