- •Глава 2. Синхронизация задач с использованием api-функций и механизмов ядра.
- •§0. Объекты ядра. Основы.
- •Учет пользователей объектов ядра
- •Процесс и поток: краткая характеристика
- •Создание объекта ядра
- •Закрытие объекта ядра
- •Синхронизация объектов
- •Наследование описателей объекта
- •Именованные объекты
- •3. После этого вызова система проверяет, существует ли уже объект ядра с таким же именем. Если существует, то
- •Open-функции
- •Дублирование описателей объектов
- •1) Процесс-катализатор.
- •2) Процесс-источник.
- •3) Процесс-приемник.
- •Исходное состояние
- •1 0XF0000000 (неприм.) (неприм.)
- •1 0XF0000000 (неприм.) (неприм.)
- •Состояние после вызова DuplicateHandle
- •§1. Синхронизация задач с использованием функций ожидания.
- •Функция ожидания одного объекта
- •Функция ожидания нескольких объектов
- •Функция ожидания нескольких объектов и сообщений
- •Функция создания дочернего процесса
- •Функция завершения дочернего процесса из самого дочернего процесса
- •Функция завершения дочернего процесса из процесса родителя
- •Функция создания вторичного потока
- •Функция завершения дочернего потока из самого дочернего потока (only c)
- •Функция завершения дочернего потока из потока родителя
- •If (my_file.Is_open()) { /// Если удалось открыть
- •Функция создания вторичного потока _beginthread
- •Функция создания вторичного потока _beginthreadex
- •§2. Синхронизация задач с помощью объектов ядра «событие» (Event).
- •Функция создания события
- •Функция установки сигнального состояния события
- •Функция установки несигнального состояния события
- •Функция открытия существующего именованного объекта события
- •Дескриптор защиты (структура)
- •§3. Синхронизация задач с помощью объектов ядра «семафор» (Semaphore).
- •Функция создания семафора
- •Функция открытия семафора
- •Функция увеличения счетчика семафора на указанное количество
- •If (!ReleaseSemaphore( ghSemaphore, 1, null)) /// Если ошибка
- •§4. Синхронизация задач с помощью объектов ядра «мьютекс» (Mutex).
- •Функция создания мьютекса
- •Функция открытия существующего именованного объекта мьютекса
- •Функция освобождения владельца указанного объекта мьютекса
- •§5. Синхронизация задач с помощью объектов ядра «уведомление об изменении» (Change Notification).
- •Функция создания объекта ядра «уведомление об изменении»
- •Функция перезапуска объекта ядра «уведомление об изменении»
- •Функция остановки мониторинга дескриптора объекта ядра «уведомление об изменении»
- •§6. Синхронизация задач с помощью объектов ядра «таймер ожидания» (Waitable Timer).
- •Функция создания объекта ядра «таймер ожидания»
- •Функция активации объекта ядра «ожидаемый таймер»
- •Функция открытия объекта ядра «ожидаемый таймер»
- •1. Функцией CancelWaitableTimer().
- •2. Функцией SetWaitableTimer().
- •If (bSuccess) /// Если успешно, то
- •If (bSuccess) /// Если успешно, то
- •§7. Синхронизация задач с помощью объектов ядра «канал» (Pipe).
- •Анонимный канал
- •Создание анонимных каналов
- •Соединение клиентов с анонимным каналом
- •Обмен данными по анонимному каналу
- •Именованный канал
- •Функция создания именованного канала
- •Функция соединения сервера с клиентом
- •Отключение сервера от клиента
- •Функция ожидания операции именованного канала
- •Функция объединения функций именованного канала
- •Подключение клиента к серверу
Функция ожидания нескольких объектов
DWORD WaitForMultipleObjects(
IN DWORD nCount,
IN CONST HANDLE* hHandles,
IN BOOL bWaitAll,
IN DWORD dwMilliseconds
);
Краткое описание.
Функция WaitForMultipleObjects ждет до тех пор, пока один или все указанные объекты не окажутся в сигнальном состоянии или не истечет интервал времени ожидания.
Параметры и описание:
(1) nCount определяет количество интересующих объектов ядра.
(2) hHandles определяет массив дескрипторов объекта. Функция может указывать дескрипторы любого из следующих типов объектов: (1) уведомление об изменении, (2) консольный ввод, (3) событие, (4) мьютекс, (5) процесс, (6) семафор, (7) поток, (8) ожидаемый таймер, (9) уведомление о ресурсе памяти.
(3) bWaitAll принимает либо TRUE, либо FALSE. Если TRUE, то функция завершается, когда все объекты находятся в сигнальном состоянии. Если FALSE, то функция завершается, когда любой один объект переходит в сигнальное состояние.
(4) dwMilliseconds определяет интервал времени ожидания (в мс).
Возвращаемое значение указывает, какой объект перешел в сигнальное состояние.
Возвращаемое значение:
Примечание. WAIT_OBJECT_0 определяется как 0, а WAIT_ABANDONED_0 определяется как 0x00000080L
— От WAIT_OBJECT_0 до (WAIT_OBJECT_0 + count – 1)
Если bWaitAll имеет значение TRUE, возвращаемое значение указывает, что у всех указанных объектов сигнальное состояние.
Если bWaitAll имеет значение FALSE, возвращаемое значение минус WAIT_OBJECT_0 указывает индекс массива hHandles объекта, который удовлетворил ожидание. Если во время вызова было сигнализировано несколько объектов, то возвращается индекс массива сигнализируемого объекта с наименьшим значением индекса всех сигнализируемых объектов.
— От WAIT_ABANDONED_0 до (WAIT_ABANDONED_0 + Count – 1)
Если bWaitAll имеет значение TRUE, возвращаемое значение указывает, что состояние всех указанных объектов сигнализируется и по крайней мере один из объектов является заброшенным объектом мьютекса.
Если bWaitAll имеет значение FALSE, возвращаемое значение минус WAIT_ABANDONED_0 указывает индекс массива hHandles заброшенного объекта мьютекса, который удовлетворил ожидание. Право собственности на объект мьютекса предоставляется вызывающему потоку, а мьютекс имеет несигнальное состояние.
— WAIT_TIMEOUT (0x00000102L)
Истек интервал ожидания, и условия, заданные параметром bWaitAll, не выполняются.
— WAIT_FAILED (0xFFFFFFFF)
Функция не выполнена (ошибка).
Дополнительная информация.
Будьте осторожны при вызове функций ожидания и кода, который прямо или косвенно создает окна. Поток, использующий функцию ожидания без интервала времени ожидания, может привести к зависанию системы. Поэтому, если у вас есть поток, который создает окна, используйте MsgWaitForMultipleObjects.
Функция ожидания нескольких объектов и сообщений
DWORD MsgWaitForMultipleObjects(
IN DWORD nCount,
IN CONST HANDLE* hHandles,
IN BOOL bWaitAll,
IN DWORD dwMilliseconds,
IN DWORD dwWakeMask
);
Краткое описание.
Функция завершает свою работу не только при переходе объектов в сигнальное состояние или истечения интервала ожидания, но и при поступлении сообщений, определенных маской dwWakeMask.
Параметры и описание:
(1) nCount определяет количество дескрипторов объектов в массиве, на которое указывает hHandles. Максимальное количество дескрипторов объекта - MAXIMUM_WAIT_OBJECTS минус один. Если этот параметр имеет значение 0, то функция ожидает только входного события.
(2) hHandles определяет массив дескрипторов объекта. Массив может содержать дескрипторы объектов разных типов, но не может содержать несколько копий одного и того же дескриптора. Функция может указывать дескрипторы любого из следующих типов объектов: (1) уведомление об изменении, (2) консольный ввод, (3) событие, (4) мьютекс, (5) процесс, (6) семафор, (7) поток, (8) ожидаемый таймер, (9) уведомление о ресурсе памяти.
(3) bWaitAll принимает либо TRUE, либо FALSE. Если TRUE, то функция завершается, когда все объекты находятся в сигнальном состоянии и было получено входное событие. Если FALSE, то функция завершается, когда любой один объект переходит в сигнальное состояние или получено входное событие. В этом случае возвращаемое значение указывает на объект, состояние которого вызвало возврат функции.
(4) dwMilliseconds определяет интервал времени ожидания (в мс).
(5) dwWakeMask определяет типы ввода, для которых дескриптор объекта события ввода будет добавлен в массив дескрипторов объекта. Принимает следующие значения:
— QS_ALLEVENTS (0x04BF) — входное сообщение WM_TIMER, WM_PAINT, WM_HOTKEY или опубликованное сообщение находится в очереди.
— QS_ALLINPUT (0x04FF) — любое сообщение находится в очереди.
— QS_ALLPOSTMESSAGE (0x0100) — размещенное сообщение находится в очереди.
— QS_HOTKEY (0x0080) — сообщение WM_HOTKEY находится в очереди. Функция реагирует на асинхронное сообщение, отличное от события аппаратного ввода.
— QS_INPUT (0x407) — входящее сообщение находится в очереди.
— QS_KEY (0x0001) — сообщение WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP или WM_SYSKEYDOWN находится в очереди.
— QS_MOUSE (0x0006) — сообщение WM_MOUSEMOVE или сообщение кнопки мыши (WM_LBUTTONUP, WM_RBUTTONDOWN и т. д.) находится в очереди.
— QS_MOUSEBUTTON (0x0004) — сообщение кнопки мыши (WM_LBUTTONUP, WM_RBUTTONDOWN и т. д.).
— QS_MOUSEMOVE (0x0002) — сообщение WM_MOUSEMOVE находится в очереди.
— QS_PAINT (0x0020) — сообщение WM_PAINT находится в очереди.
— QS_POSTMESSAGE (0x0008) — размещенное сообщение находится в очереди.
— QS_RAWINPUT (0x0400) — исходное входящее сообщение находится в очереди.
— QS_SENDMESSAGE (0x0040) — сообщение, отправленное другим потоком или приложением, находится в очереди.
— QS_TIMER (0x0010) — сообщение WM_TIMER находится в очереди.
Возвращаемое значение:
Примечание. WAIT_OBJECT_0 определяется как 0, а WAIT_ABANDONED_0 определяется как 0x00000080L
— От WAIT_OBJECT_0 до (WAIT_OBJECT_0 + nCount – 1)
Если bWaitAll имеет значение TRUE, возвращаемое значение указывает, что у всех указанных объектов сигнальное состояние.
Если bWaitAll имеет значение FALSE, возвращаемое значение минус WAIT_OBJECT_0 указывает индекс массива hHandles объекта, который удовлетворил ожидание.
— WAIT_OBJECT_0 + nCount
Новый входной тип, указанный в параметре dwWakeMask, доступен во входной очереди потока. Это значение также возвращается при возникновении системного события, которое требует действия потока, такого как активация переднего плана.
— От WAIT_ABANDONED_0 до (WAIT_ABANDONED_0 + nCount – 1)
Если bWaitAll имеет значение TRUE, возвращаемое значение указывает, что состояние всех указанных объектов сигнализируется и по крайней мере один из объектов является заброшенным объектом мьютекса.
Если bWaitAll имеет значение FALSE, возвращаемое значение минус WAIT_ABANDONED_0 указывает индекс массива hHandles заброшенного объекта мьютекса, который удовлетворил ожидание. Право собственности на объект мьютекса предоставляется вызывающему потоку, а мьютекс имеет несигнальное состояние.
— WAIT_TIMEOUT (258L)
Истекло время ожидания, и условия, заданные параметрами bWaitAll и dwWakeMask, не были выполнены.
— WAIT_FAILED (0xFFFFFFFF)
Функция не выполнена (ошибка).
Домашнее задание.
Узнать про функции CreateProcess и CreateThread.