- •Глава 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).
- •Анонимный канал
- •Создание анонимных каналов
- •Соединение клиентов с анонимным каналом
- •Обмен данными по анонимному каналу
- •Именованный канал
- •Функция создания именованного канала
- •Функция соединения сервера с клиентом
- •Отключение сервера от клиента
- •Функция ожидания операции именованного канала
- •Функция объединения функций именованного канала
- •Подключение клиента к серверу
§2. Синхронизация задач с помощью объектов ядра «событие» (Event).
События являются самыми примитивными объектами ядра. События, по своей сути, являются уведомлениями об окончании каких-либо действий.
Событие (дескриптор) содержит счетчик числа пользователей и две логические переменные — тип события и состояние события (сигнальное или несигнальное).
Типы событий:
Первый тип события — с ручным сбросом. Можно перенести в несигнальное состояние только при помощи функции ResetEvent.
Второй тип события — с автоматическим сбросом. Можно перенести в несигнальное состояние как с помощью функции ResetEvent, так и с помощью функций ожидания.
Когда поток успешно дождался события с автоматическим сбросом, состояние автоматически сбрасывается в несигнальное (занятое) состояние.
Если события с автоматическим сбросом ожидает несколько потоков с помощью функции WaitForSingleObject, то из состояния ожидания освобождается только один из них.
Функция создания события
HANDLE CreateEvent(
IN LPSECURITY_ATTRIBUTES lpEventAttr,
IN BOOL bManualReset,
IN BOOL bInitialState,
IN LPCSTR lpName
);
Краткое описание.
Создает или открывает именованный или безымянный объект события.
Параметры и описание:
(1) lpEventAttr определяет указатель на структуру SECURITY_ATTRIBUTES. Если этот параметр равен NULL, дескриптор не может наследоваться дочерними процессами. Член этой структуры lpSecurityDescriptor определяет дескриптор безопасности для нового события. Если lpEventAttr имеет значение NULL, событие получает дескриптор безопасности по умолчанию.
(2) bManualReset определяет тип события. TRUE — с ручным сбросом, FALSE — с автоматическим сбросом.
(3) bInitialState определяет начальное состояние события. TRUE — сигнальное, FALSE — несигнальное.
(4) lpName определяет имя события (необходимо для того, чтобы другой (другие) процесс (-ы) мог (-ли) получить доступ к этому событию).
Возвращаемое значение.
При успешном выполнении возвращается дескриптор события, иначе NULL.
Функция установки сигнального состояния события
BOOL SetEvent(IN HANDLE hEvent);
Если функция завершается успешно, возвращаемое значение отлично от нуля (bool: true), иначе возвращаемое значение равно нулю (bool: false).
Функция установки несигнального состояния события
BOOL ResetEvent(IN HANDLE hEvent);
Если функция завершается успешно, возвращаемое значение отлично от нуля (bool: true), иначе возвращаемое значение равно нулю (bool: false).
Функция, которая устанавливает объект события в сигнальное состояние и затем сбрасывает его в несигнальное состояние после освобождения соответствующего числа ожидающих потоков.
Примечание: эта функция ненадежна и не должна использоваться; она существует в основном для обратной совместимости.
BOOL PulseEvent(IN HANDLE hEvent);
Если функция завершается успешно, возвращаемое значение отлично от нуля (bool: true), иначе возвращаемое значение равно нулю (bool: false).
В случае с событием с ручным сбросом функция PulseEvent позволит всем потокам, которые ожидают события и могут немедленно завершить ожидание (например, ждут только этого события), выйти из состояния ожидания. Затем функция переводит событие в несигнальное состояние и завершается.
Для событий с автоматическим сбросом функция позволит одному из потоков выйти из состояния ожидания, если это возможно, после чего переводит событие в несигнальное состояние и завершается.
Дополнительная информация.
Обратите внимание, что для потока, использующего функции ожидания с несколькими объектами, для ожидания сигнализации всех указанных объектов, PulseEvent может установить состояние объекта события как сигнальное и сбросить его в состояние без сигнала, не вызывая функцию ожидания для возврата. Это происходит, если не все указанные объекты одновременно сигнализируются.