Параллельное и распределенное программирование на С++
Шрифт:
{guarded} Синхронизированный последовательный доступ к этому методу встроен в объект; целостность объекта гарантируется
{concurrent} К этому метолу разрешен множественный параллельный доступ: целостность объекта при этом гарантируется
Свойства guarded и concurrent можно использовать для отражения модели PRAM (Parallel Random-Access Machine — параллельнал машина с произвольным доступом). Если метод считывает и/или записывает данные в память, доступную для другого метода, который также считывает и/или записывает данные в гу же память, этот метод может быть описан как PRAM-алгоритм. При этом можно использовать соответствующие
PRAM-алгоритмы
Свойства
CR (Concurrent Read — параллельное чтение)
concurrent
CW (Concurrent Write — параллельная запись)
concurrent
CRCW (Concurrent Read Concurrent Write — параллельное чтение, параллельная запись)
concurrent
EW (Exclusive Write — монопольнал запись)
guarded
ER (Exclusive Read — монопольное чтение)
guarded
EREW (Exclusive Read Exclusive Write — монопольное чтение, монопольная запись)
guarded
Описание класса student_schedule можно сделать еще более подробным, указав с помощью свойств, как использовать его (класса) атрибуты и операции.
Атрибуты:
StudentNumber : string {frozen}
Term : string {changeable}
StudentSchedule : map <string,vector<course> > {changeable}
Операции:
scheduleDayOfWeek(&X : vector<course>, Day : string) :void {guarded}
studentNumber : string {isQuery, concurrent}
Атрибут StudentNumber представляет собой константу типа string. После присвоения значение константы изменить нельзя. Если объект student_schedule используется для того же студента, но для различных периодов времени, то атрибуты Term и StudentSchedule должны быть модифицируемыми. Метод scheduleDayOfWeek принимает вектор курсов (vector<course>) для конкретного дня недели, хранимого в строке Day. Это — защищенная (guarded) операция. Она помещает расписание студента, соответствующее конкретному дню недели, в map- объект StudentSchedule, изменяя тем самым его состояние. Синхронизация, встраиваемая в этот объект, обеспечивается за счет использования мьютексов. Метод studentNumber имеет два свойства: isQuery и concurrent. Этот метод возвращает константу StudentNumber и безопасен для одновременного доступа. Его вызов не изменяет состояния объекта, поэтому здесь и использовано свойство isQuery.
На диаграмме класса можно отобразить е щ е одно важное свойство атрибутов и операций — их видимость. Свойство видимости описывает, кто может получить доступ к атрибуту или вызвать операцию. Для представления этого свойства (уровня видимости) используется соответствующий символ. Уровни видимости соответствуют спецификаторам доступа, определенным в С++.
Симво л
Спецификаторы доступа
Символы видимости
public
(+) Об
щ
ий доступ
protected
(#) Доступ имеет сам к
л
асс и его потомки
private
(-) Доступ имеет то
л
ько сам к
л
асс
Организация атрибутов и операций
От того, как будут организованы атрибуты и операции в соответствующих отделениях диаграммы класса, зависит степень успешности использования этого класса. Атрибуты и операции можно упорядочить по алфавиту, уровню доступа или категориям. Как оказалось, алфавитный порядок вряд ли поможет узнать, как могут называться те или иные атрибуты или операции (если документация находится в руках пользователя системы), или какие из них еще не определены (если документация используется в процессе разработки). Упорядочение по уровню доступа зарекомендовало себя гораздо лучше. В этом случае пользователь четко видит, какие атрибуты и операции являются, например, общедоступными (public) или закрытыми (private). Знание перечня защищенных (protected) членов поможет расширить возможности класса или специализировать ero, используя механизм наследования. Такое упорядочение просто реализовать с помощью символов видимости (+, - и #) или C++-спецификаторов доступа (public, private и protected,).
Существует несколько способов разбиения атрибутов и операций по кате г ориям. Минимальный стандартный интерфейс определяет категории для операций, которые в свою очередь определяют атрибуты, поддерживающие эти операции. Составители минимального стандартного интерфейса руководствовались тем, что все классы должны определять такие операции и функции, которые делают его полезным. Вот список этих операций:
• конструктор по умолчанию;
• деструктор;
• конструктор копии;
• операции присваивания;
• операции сопоставления на равенство;
• операции ввода-вывода;
• операции хеширования;
• операции запросов.
Этот список можно использовать в качестве основного перечня категорий для классификации операций, определяемых в классе. В этот перечень можно внести категории, которые позволяют указать дополнительные характеристики для атрибутов и операций.
Атрибуты:
• static
• const
Операции:
• virtual
• pure virtual
• friend
При выборе категорий следует исходить из того, какал из них лучше всего описывает услуги, предоставляемые классом. Имя категории справа и слева заключается вдвойные угловые скобки («. . .»). На рис. 10.3 показано два возможных способа организации атрибутов и операций для класса student_schedule, использующих: символы видимости и спецификаторы доступа (рис. 10.3, а) и категории минимально-гостандартного интерфейса (рис. 10.3, б).