Особый интерес для нашей «классной доски» представляют операции pvm_barrier() и pvm_joingroup(), поскольку существуют ситуации, в которых «классная доска» не запускает новые источники знаний до тех пор, пока определенная группа источников знаний не завершит свою работу. Для блокирования вызывающего процесса до нужного момента (до окончания обработки данных соответствующими источниками знаний) можно использовать операцию pvm_barrier (). Например, «классная доска» в качестве консультанта по выбору курсов обучения не будет активизировать источник знаний, отвечающий за составление расписания, до тех пор, пока не представят свои предложения источники знаний, которые специализируются на основных, общеобразовательных, второстепенных и факультативных курсах. Поэтому «классная доска» будет использовать операцию pvm_barrier () для ожидания завершения работы этой группы PVM-задач. На рис. 13.5 представлена UML-диаграмма видов деятельности, которая позволяет понять, как синхронизируются источники знаний и «классная доска».
Барьер синхронизации здесь реализуется с помощью операций pvm_barrier () и pvm_joingroup (). Реализация операторной функции для объекта задачи приве д ена в л истин г е 13.5.
Таблица 13.2. Групповые PVM-операции
int pvm_joingroup (char *groupname); Вносит вызывающий процесс в группу groupname, а затем возвращает int-значение, которое представляет собой номер процесса в этой группе
>int pvm_lvgroup (char *groupname);
Удаляет вызывающий процесс из группы groupname
>int pvm_gsive (char *groupname);
Возвращает int-значение, которое представляет собой количество членов в группе groupname
>int pvm_gettid (char *groupname, int inum);
Возвращает int-значение, равное идентификационному номеру задачи, выполняемой процессом, который идентифицируется именем группы groupname и номером экземпляра inum
>int pvm_getinst (char *groupname, int taskid);
Возвращает int-значение, которое представляет собой номер экземпляра, связанный с именем группы groupname и процессом, выполняющим задачу с идентификационным номером taskid
>int pvm_barrier (char *groupname, int count);
Блокирует вызывающий процесс до тех пор, пока count членов в группе groupname не вызовут эту функцию
>int pvm_bcast (char *groupname, int messageid);
Передает всем членам группы groupname сообщение, хранимое в активном буфере отправки, связанном с номером messageid
>int pvm_reduce (void *operation, void *buffer, int count, int datatype, int messageid, char *groupname, int root);
Выполняет глобальную операцию operation во всех процессах группы groupname