Основная программа voidmain() сначала определяет две новых задачи с помощью оператора newConstruction, чтобы создать два процессорных объекта foundry_pobj и bridge_pobj. Затем, используя ключевое слово par, создает два процесса foundry(channel, 100) и bridge(channel), по одному в каждом процессорном объекте. Эти две задачи связываются каналом путем вызова функций, определенных в классе Channel (Класс описан в тексте 3.15). В основной программе канал объявлен аргументами, через которые он передается процессам foundry и bridge. Эти процессы используют для доступа к каналу функциям get_out_port и get_in_port. Последние указывают на объекты out_port и in_port, которые непосредственно используются для передачи и приема.
Изначально программа на CC++ подобно программе на С++ выполняет задачу, как единственный процесс управления. Однако в CC++ программа может использовать специальные операторы par (параллельные блоки), parfor (параллельное выполнение тела цикла) и spawn (порождение конструкций), которые создают дополнительные процессы (потоки). Параллельный блок СС++ отличается от обыкновенного блока C++, в котором блок представляется последовательностью операторов, взятых в фигурные скобки, лишь предваряющим этот блок ключевым словом par:
par
{
Statement1;
Statement2;
...
StatementN;
}
Параллельный блок может включать любые законные операторы CC++ кроме переменных, которые не объявлялись, и операторов, которые приводят к нелокальным изменениям текущего управления, типа return.
Операторы в параллельном блоке выполняются одновременно. Например, следующий параллельный блок создает три взаимодействующих процесса: два процесса с именем worker (рабочий) и один master (хозяин).
par
{
worker();
worker();
master();
}
Работа параллельного блока заканчивается тогда, когда все входящие в него операторы (рабочие и хозяин) заканчивают свою работу. После этого начинается выполнение следующих за параллельным блоком операторов.
При распараллеливании циклов типа for создается множество процессов, выполняющих одни и те же операторы, входящие в тело цикла. От обычного оператора цикла типа for запись параллельного цикла отличается лишь тем, что используется ключевое слово parfor. Например, следующий код создает десять процессов, каждый из которых выполняет функцию myprocess:
parfor (int i=0; i<10; i++) { myprocess(i);}
Здесь только тело цикла parfor выполняется параллельно. Инициализация, проверка условного выражения и модификация переменной цикла протекает в обычном порядке следования. Если раздел инициализации переменной цикла использует локально объявленную переменную (например, int i), то каждый образец тела параллельного цикла будет иметь свою собственную частную копию этой переменной.
В CC++ параллельные конструкции могут быть вложены произвольным образом. Например, следующий код создает десять потоков рабочего и одного хозяина.
par
{
master();
parfor (int i=0; i<10; i++)
worker(i);
}
Оператор порождения процессов spawn тоже может использоваться для определения неструктурированной параллельности. Однако этот оператор может применяться к некоторой функции, чтобы создать полностью независимый вычислительный процесс. При этом породивший процесс не ждет завершения выполнения операции от нового процесса и не может получить возвращаемое значение от названной функции.
Вычислительный процесс и его состояние, характеризуемое конкретными значениями его переменных в определенном адресном пространстве, концептуально представляется неким связным, единым образованием.
В CC++ эти две концепции (процессорные объекты и процессы) отделены и описываются порознь. Процессорные объектыпредставляют адресные пространства для размещения состояний переменных, то есть являются статическими объектами, а процессы представляют конкретные вычислительные действия, то есть отражают динамику задачи. Процессорные объекты могут существовать независимо от процессов. В одном процессорном объекте могут отображаться более одного процесса.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.