Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_OS_chast_2.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.55 Mб
Скачать

События.

Событием называется сообщение о некотором выполненном в системе действии. В ОС события используются для оповещения одного потока о том, что другой поток выполнил некоторое действие. Задача оповещения одного потока о действии, которое совершил другой поток, называется задачей условной синхронизации, или задачей оповещения.

В ОС Windows, событие описывается объектами ядра системы Events. Существует два типа событий:

  1. события с ручным сбросом;

  2. события с автоматическим сбросом.

Различие между ними состоит в том, что события с ручным сбросом можно перевести в несигнальное состояние только путем вызова функции ResetEvent (), а событие с автоматическим сбросом переходит в несигнальное состояние как при помощи ResetEvent, так и при помощи функции ожидания. При этом, если события с автоматическим сбросом ожидают несколько потоков, используя WaitForSingleObject, то из состояния ожидания освобождается только один из этих потоков.

События создаются путем вызова CreateEvent, которая имеет четыре параметра - pe1, pe2, pe3, pe4.

  • pe1 – атрибуты защиты;

  • pe2 – тип события;

  • pe3 – начальное состояние;

  • pe4 – имя события.

Чаще всего, первый параметр получает значение NULL. Если pe2 == true, то создается событие с ручным сбросом, в противном случае – с автоматическим. Если pe3==true, то начальное состояние события является сигнальным, а в противном случае – несигнальным. pe4 определяет имя события, которое позволяет обращаться к нему из потоков, выполняющихся в разных процессах. Событие может быть безымянным.

В случае удачного завершения, CreateEvent возвращает Handle, и NULL – в противном случае. Если событие с указанным в pe4 именем уже существует, то CreateEvent возвращает дескриптор существующего события, а GetLastError будет возвращать ERROR_ALREADY_EXISTS.

Для перевода любого события в сигнальное состояние используется функция SetEvent (Handle). При успешном завершении возвращается не ноль, и ноль – в противном случае.

Функция ResetEvent (Handle) используется для перевода любого события в несигнальное состояние. Возвращает аналогичные значения.

Для освобождения потоков, ожидающих сигнального состояния события с ручным сбросом используется функция PulseEvent (Handle). При вызове этой функции, все потоки, ждущие события с дескриптором Handle, выводятся из состояния ожидания, а само событие переходит в несигнальное состояние. Если эта функция вызывается для события с автоматическим сбросом, то из состояния ожидания выводится только один из ожидающих потоков. Если потоков, ожидающих сигнального состояния события нет, то состояние этого события остается несигнальным.

Доступ к уже существующему событию может быть открыт с помощью CreateEvent или OpenEvent. При использовании CreateEvent, значения второго и третьего её параметров игнорируются, поскольку они уже заданы другим потоком. Поток, в котором вызывается функция CreateEvent, получает полный доступ к событию с именем, заданным в четвертом параметре. Функция OpenEvent используется в том случае, когда заранее известно, что поток с заданным именем уже существует. Формат:

OpenEvent (po1, po2, po3);

  • po1 – определяет флаги доступа;;

  • po2 – режим наследования;

  • po3 – имя события.

Смысл второго и третьего параметров аналогичен этим параметрам в мьютексе.

po1 определяет тип доступа к событию, и может быть представлен логической комбинацией трех флагов.

Флаг a означает полный доступ – поток может выполнять над событием любые действия. Флаг b называется модификацией состояния. Он означает, что поток может использовать функции SetEvent и ResetEvent для изменения состояния события. Флаг c называется синхронизацией. Поток может использовать события в функциях ожидания.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]