Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
os_a_win.doc
Скачиваний:
15
Добавлен:
17.11.2019
Размер:
715.26 Кб
Скачать

Побочные эффекты ожидания.

Некоторые объекты изменяют свое состояние после того, как одна из Wait-функций успешно завершила ожидание на этом объекте. Например, объект «событие с автосбросом» переходит из свободного состояния в занятое. Такое действие называют побочным эффектом успешного ожидания (successful wait side effect). Действия, выполняемые Wait-функциями, являются атомарными, и это гарантирует, что побочные эффекты будут произведены корректно. Например, если сразу два потока ожидают один и тот же объект «событие с автосбросом», то Wait-функция сработает только в одном из них, и сразу же вернет объект в занятое состояние, предотвращая возобновление работы второго процесса.

Другая особенность побочных эффектов связана с функциями, работающими с несколькими объектами. В этом случае побочный эффект проявляется только в тот момент, когда выполнено условие ожидания. Если мы передали функции WaitForMultipleObjects дескрипторы двух событий, и одно из них перешло в активное состояние, то ничего не произойдет – поток продолжит ожидание и побочный эффект не будет реализован. Только когда оба объекта перейдут в свободное состояние Wait-функция возобновит свою работу и сможет оказать свое побочное действие. Эта операция также будет выполнена атомарно.

События

Событие (event) является самым простым объектом ядра, предназначенным для синхронизации. Этот объект содержит булеву переменную, которая отвечает за его состояние – занят или свободен. Объект событие может быть двух разных типов – с автосбросом (auto-reset event) или со сбросом вручную (manual-reset event). Событие с автосбросом переходит из свободного состояния в занятое в результате побочного эффекта ожидания, тогда как состояние события с ручным сбросом может быть изменено только с помощью специальных функций. Различие между этими типами объектов становится существенным, если несколько потоков одновременно ожидают это событие. В случае события с автосбросом только один поток получит возможность выполнения. При применении событий с ручным сбросом все ожидающие его потоки получат шанс продолжить выполнение.

Для создания объекта событие нужно вызвать функцию CreateEvent:

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes, // SD

BOOL bManualReset, // reset type

BOOL bInitialState, // initial state

LPCTSTR lpName // object name

);

Параметр bManualReset определяет тип объекта: значение TRUE соответствует объекту с ручным управлением, FALSE – с автоматическим. Начальное состояние объекта (занят или свободен) определяется параметром bInitialState.

Для открытия объекта по известному имени можно использовать функцию OpenEvent.

Для управления состоянием объекта используются две функции:

BOOL SetEvent(

HANDLE hEvent // handle to event

);

BOOL ResetEvent(

HANDLE hEvent // handle to event

);

Функция SetEvent переводи объект в свободное состояние, а ResetEvent – в занятое. Обычно с помощью SetEvent мы сигнализируем ожидающим потоку (потокам), что произошло какое-то событие, и они могут продолжить свое выполнение.

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