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


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


До сих пор речь шла в основном об абстрактных классах и концепциях. Теперь посмотрим, как пользоваться этой архитектурой на благо всего человечества. Я представлю Вам CInterlockedScalar — класс шаблона, производный от CInterlockedType. С его помощью Вы сможете создавать безопасные в многопоточной среде скалярные (простые) типы данных — байт, символ, l6-, 32- или 64-битное целое, вещественное значение (с плавающей точкой) и т. д. Поскольку CInterlockedScalar является производным от класса CInrerlockedType, у него нет собственных элементов данных. Конструктор CInterlockedScalar просто обращается к конструктору CInterlockedType, передавая ему начальное значение объекта скалярных данных Класс CInterlockedScalar работает только с числовыми значениями, и в качестве начального значения я выбрал нуль, чтобы наш объект всегда создавался в известном состоянии. Ну а деструктор класса CInterlockedScalar вообще ничего не делает.

Остальные функции-члены класса CInterlockedScalar отвечают за изменение скалярного значения. Для каждой операции над ним предусмотрена отдельная функция член. Чтобы класс CInterlockedScalar мог безопасно манипулировать своим объектом данных, все функции-члены псрсд выполнением какой-либо операции блокируют доступ к этому объекту. Функции очень просты, и я не стану подробно объяснять их; просмотрев исходный код, Вы сами поймете, что они делают. Однако я покажу, как пользоваться этими классами. В следующем фрагменте кода объявляется безопасная в многопоточной среде переменная типа BYTE и над ней выполняется серия операций:

CInterlockedScalar<BYTE> b = 5, // безопасная переменнан типа BYTE

BYTE b2 = 10; // небезопасная переменная типа BYTF

b2 = b++; // b2=5, b=6

b *= 4; // b=24

b2 = b, // b2=24, b=24

b += b; // b=48

b %= 2; // b=0

Работа с безопасной скалярной переменной также проста, как и с небезопасной. Благодаря замещению (перегрузке) операторов в С++ даже код в таких случаях фактически одинаков! С помощью С++-классов, о которых я уже рассказал, любую небезопасную переменную можно легко превратить в безопасную, внеся лишь минимальные изменения в исходный код своей программы.




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



Книжный магазин