Параллельное программирование: Учебное пособие, страница 56

Синхронизирующая переменная(sync variable) – особый модификатор типа sync, предназначенный для синхронизации выполняющихся процессов.

Неделимая функция(atomic function) – функция, не допускающая дальнейшего расчленения, специфицируется ключевым словом atomic, которое определяет управление отдельными процессами в одном и том же процессорном объекте.

Функции передачи(transfer functions) – предопределенные функции типа CCVoid, которые позволяют передавать между процессорными объектами произвольные структуры данных, представленные аргументами (параметрами) вызывающих процедур RPC (remote procedure call).

Перечисленные абстракции обеспечивают основные механизмы, задающие параллелизм, местоположение, связь и отображение. Применение новых дополнений к языку С++ удобно рассмотреть на двух достаточно наглядных задачах, приводимых многими авторами на протяжении уже нескольких десятилетий.

Первая задача представляет упрощенную модель поставки продукции некоторого завода потребителю, который эту продукцию использует. Продукция может производиться заводом быстрее или медленнее, чем ее использует потребитель. Передача продукции отдельными порциями обеспечивается средствами доставки с ограниченной пропускной способностью, образуя тем самым канал связи между производителем  и  потребителем.  Если потребитель  не  успевает использо-

вать продукцию, то у него есть два альтернативных решения: либо складировать у себя готовую продукцию, либо сообщить предприятию о приостановке ее производства. Если потребитель использует продукцию быстрее ее доставки, то потребление должно быть приостановлено, то есть потребитель должен ждать и ничего не делать. В этом процессе можно выделить как минимум три взаимодействующих друг с другом объекта: производитель – назовем его  задачей foundry, получатель – функцию его по приему на дальнейшую обработку или складирование продукции назовем задачей bridge  и средства перемещения продукции от производителя к потребителю с ограниченной пропускной способностью, например, перевозка несколькими автомобилями, назовем каналом (Channel).

Текст 3.3. – Взаимодействие производителя и потребителя

globalclassConstruction:publicChannelUser

//Класс  Construction  получается из класса  ChannelUser

{

public:              // В классе объявляются две общие функции-члены

void foundry(Channel, int);

void bridge(Channel);

};

void Construction::foundry(Channel channel, int cnt)

{                                                 // Извлечение из канала outport 

OutPort *out = (OutPort *)

channel.get_out_port();

// Посылка в канал значений cnt

for (int i=1; i<=cnt; i++)

out->send(i);              // Вызов метода из класса  OutPort

out->send(-1);     // Посылка значения конца в канал (channel)

}

void Construction::bridge(Channel channel)

{

intval;                           // Извлечение из канала  inport

InPort *in = (InPort *) channel.get_in_port();

// Получение значений до обнаружения конца

while ((val = in->receive()) != -1)

printf (“Got value ” %);

}

void main(int argc, char *argv[])

{

// Создание новых процессорных объектов для foundry и bridge

Construction *global foundry_pobj =new Construction;

Construction *global bridge_pobj = new Construction;

// Создание канала между новыми процессорными объектами

Channel channel(foundry_pobj, bridge_pobj );

// Связывание foundry и bridge каналом channel

par

{

foundry_pobj->foundry(channel, 100);

bridge_pobj->bridge(channe1);

}

}

Текст приведенного фрагмента программы демонстрирует многие особенности CC++. В программе создаются две задачи (foundry и bridge), которые соединены с каналом. Канал при соединении используется для передачи от задачи foundry к задаче bridge набора целых чисел от 1 до 100, завершаемого значением -1, чтобы сообщить о конце посылки.