Windows для профессионалов


Создание инверсных семафоров и типов данных, безопасных в многопоточной среде - часть 6


Проектируя все эти классы, я хотел создать объект, чье поведение было бы противоположно поведению семафора. Эту функциональность предоставляет мой C++ класс CWhenZero, производный от CInrerlockedScaIar Когда скалярное значение равно 0, объект CWhenZero пребывает в свободном состоянии, а когда оно не равно 0 — в занятом.

Как Вам известно, С++-объекты не поддерживают такие состояния — в них могут находиться только объекты ядра. Значит, в CWhenZero нужны дополнительные элементы данных с описателями объектов ядра "событие". Я включил в объект CWhenZero два элемента данных: m_hevtZero (описатель объекта ядра "событие", переходящего в свободное состояние, когда объект данных содержит нулевое значение) и m_hevtNotZero (описатель объекта ядра "событие", переходящего в свободное состояние, когда объект данных содержит ненулевое значение).

Конструктор CWhenZero принимает начальное значение для объекта данных, а также позволяет указать, какими должны быть объекты ядра "событие" — со сбросом вручную (по умолчанию) или с автосбросом. Далее конструктор, вызывая CreateEvent, создает два объекта ядра "событие" и переводит их в свободное или занятое состоя ние в зависимости от того, равно ли нулю начальное значение. Деструктор CWhenZero просто закрывает описатели этих двух объектов ядра. Поскольку CWhenZero открыто наследует от класса CInterlockedScalar, все функции-члены перегруженного опера тора доступны и пользователям объекта CWhenZero.

Помните защищенную функцию-член OnValChanged, объявленную внутри класса CInterLockedType. Так вот, класс CWhenZero замещает эту виртуальную функцию. Она отвечает за перевод объектов ядра "событие" в свободное или занятое состояние в соответствии со значением объекта данных. OnValChanged вызывается при каждом изменении этого значения. Ее реализация в CWhenZero проверяет, равно ли нулю новое значение. Если да, функция устанавливает событие m_hevtZero и сбрасывает событие m_hevtNotZero.


Начало  Назад  Вперед