Этот класс task инкапсулирует порожденный процесс. Он содержит идентификационный но
Особый интерес для нашей «классной доски» представляют операции pvm_barrier() и pvm_joingroup(), поскольку существуют ситуации, в которых «классная доска» не запускает новые источники знаний до тех пор, пока определенная группа источников знаний не завершит свою работу. Для блокирования вызывающего процесса до нужного момента (до окончания обработки данных соответствующими источниками знаний) можно использовать операцию pvm_barrier (). Например, «классная доска» в качестве консультанта по выбору курсов обучения не будет активизировать источник знаний, отвечающий за составление расписания, до тех пор, пока не представят свои предложения источники знаний, которые специализируются на основных, общеобразовательных, второстепенных и факультативных курсах. Поэтому «классная доска» будет использовать операцию pvm_barrier () для ожидания завершения работы этой группы PVM-задач. На рис. 13.5 представлена UML-диаграмма видов деятельности, которая позволяет понять, как синхронизируются источники знаний и «классная доска».
Барьер синхронизации здесь реализуется с помощью операций pvm_barrier () и pvm_joingroup (). Реализация операторной функции для объекта задачи приве
Таблица 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
// Листинг 13.5. Определение функции operator() // в классе task
void task::operator()(string X) {
int cc; pvm_mytid();
cc = pvm_spawn(const_cast
N++;
}
Функция-оператор operator () используется для порождения PVM-задач. Имя задачи содержится в элементе X. data (). При обращении к функции pvm_spawn () (см. листинг 13.5) создается одна задача, а ее идентификационный номер сохраняется в элементе Tid[N] . (Подробнее о функции pvm_spawn () и вызове PVM-задач см. гла-вуб.) Класс task используется для создания функциональных объектов (объектов-функций). При выполнении алгоритма
for_each(Solve.begin(),Solve.end(),Task);