Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 2. Конспекты (02_04_19).rtf
Скачиваний:
65
Добавлен:
10.09.2019
Размер:
363.46 Кб
Скачать

§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 может установить состояние объекта события как сигнальное и сбросить его в состояние без сигнала, не вызывая функцию ожидания для возврата. Это происходит, если не все указанные объекты одновременно сигнализируются.