- •Операционные системы Windows32
- •Объекты ядра Windows
- •Пользователи объектов ядра
- •Защита объектов ядра
- •Дескрипторы. Таблица дескрипторов объектов ядра.
- •Создание объектов ядра
- •Закрытие объектов ядра
- •Совместное использование объектов ядра различными процессами
- •Процессы и потоки в Windows Создание процесса
- •Завершение процесса
- •Операции с процессами
- •Создание потока
- •Завершение потока
- •Потоки и библиотека языка с
- •Операции с потоками
- •Приоритеты потоков в Windows
- •Потоки в мультипроцессорных системах
- •Синхронизация потоков
- •Interlocked-функции
- •Критические секции
- •Wait-функции
- •Wait-функции для работы с одним объектом
- •Wait-функции для работы с несколькими объектами.
- •Побочные эффекты ожидания.
- •События
- •Семафоры
- •Мьютексы
- •Ожидаемые таймеры
- •Управление памятью в Windows
- •Организация виртуальной памяти Windows
- •Выделение памяти процессу
- •Атрибуты защиты страниц памяти
- •Функции менеджера памяти Windows
- •Проецируемые в память файлы
- •Проекции файлов и разделяемая память
Побочные эффекты ожидания.
Некоторые объекты изменяют свое состояние после того, как одна из 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 мы сигнализируем ожидающим потоку (потокам), что произошло какое-то событие, и они могут продолжить свое выполнение.