- •Глава 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).
- •Анонимный канал
- •Создание анонимных каналов
- •Соединение клиентов с анонимным каналом
- •Обмен данными по анонимному каналу
- •Именованный канал
- •Функция создания именованного канала
- •Функция соединения сервера с клиентом
- •Отключение сервера от клиента
- •Функция ожидания операции именованного канала
- •Функция объединения функций именованного канала
- •Подключение клиента к серверу
§6. Синхронизация задач с помощью объектов ядра «таймер ожидания» (Waitable Timer).
Таймер ожидания — объект, который самостоятельно переходит в сигнальное состояние в определенное время или через регулярный промежуток времени.
Функция создания объекта ядра «таймер ожидания»
HANDLE CreateWaitableTimer(
IN LPSECURITY_ATTRIBUTES lpTAttr,
IN BOOL bManualReset,
IN LPCTSTR lpTimerName
);
Параметры и описание:
(1) lpTAttr — определяет указатель на структуру SECURITY_ATTRIBUTES. Если этот параметр равен NULL, дескриптор не может наследоваться дочерними процессами. Член этой структуры lpSecurityDescriptor определяет дескриптор безопасности для нового объекта. Если lpTAttr имеет значение NULL, объект получает дескриптор безопасности по умолчанию.
(2) bManualReset определяет тип таймера. TRUE — с ручным сбросом, FALSE — с автоматическим сбросом.
(3) lpTimerName — определяет имя таймера.
Возвращаемое значение.
Если функция завершилась успешно, она возвращает дескриптор объекта таймера, в противном случае — возвращает NULL.
Описание.
Таймер всегда создается в несигнальном состоянии и его необходимо после создания настроить.
Функция активации объекта ядра «ожидаемый таймер»
BOOL SetWaitableTimer(
IN HANDLE hTimer,
IN CONST LARGE_INTEGER* lpDueTime,
IN LONG lPeriod,
IN PTIMERAPCROUTINE pfnComplRoutine,
IN LPVOID lpArgToComplRoutine,
IN BOOL fResume,
);
Параметры и описание:
(1) hTimer — определяет дескриптор объекта таймера. Функция CreateWaitableTimer или OpenWaitableTimer возвращает этот дескриптор. Дескриптор должен иметь право доступа TIMER_MODIFY_STATE.
(2) lpDueTime определяет время, по истечении которого необходимо установить состояние таймера с интервалом 100 наносекунд. Используйте формат, описанный структурой FILETIME. Положительные значения указывают абсолютное время. Обязательно используйте абсолютное время в формате UTC, поскольку система использует внутреннее время в формате UTC. Отрицательные значения указывают относительное время. Фактическая точность таймера зависит от возможностей оборудования.
(3) lPeriod — определяет период таймера в миллисекундах. Если lPeriod равен нулю, таймер сигнализируется один раз. Если lPeriod больше нуля, таймер является периодическим. Периодический таймер автоматически активируется каждый раз, когда истекает период, пока таймер не будет отменен с помощью функции CancelWaitableTimer или сброшен с помощью SetWaitableTimer. Если lPeriod меньше нуля, функция завершается ошибкой (возврат FALSE).
(4) pfnComplRoutine — определяет указатель на необязательную процедуру завершения. Подпрограмма завершения — это определяемая приложением процедура типа PTIMERAPCROUTINE, которая вызывается при переходе таймера в сигнальное состояние. Возможно значение NULL.
(5) lpArgToComplRoutine — определяет указатель на структуру, которая передается в процедуру завершения.
(6) fResume — определяет поведение. Если этот параметр имеет значение TRUE, восстанавливает систему в режиме приостановленного энергосбережения, когда таймер в сигнальном состоянии. Если значение FALSE, то система не восстанавливается. Если система не поддерживает восстановление, вызов завершается успешно, но GetLastError возвращает ERROR_NOT_SUPPORTED.
Возвращаемое значение.
Если функция завершилась успешно, она возвращает TRUE, в противном случае — FALSE.