Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 358

>posix_spawn_attr_init(&M);

>posix_spawn_file_actions_init(&N);

>char *const argv[] = {«knowledge_source1»,NULL};

>posix_spawn(&Pid,«knowledge_source1»,&N,&M,argv,NULL);

>//. . .

>}

В листинге 13.8 инициализируются атрибуты и действия, необходимые для порождения задач, после чего с помощью функции posix_spawn() создается отдельный процесс, который предназначен для выполнения источника знаний knowledge_source1. После создания этого процесса «классная доска» получает к нему доступ через его идентификационный номер, сохраняемый в параметре Pid. Кроме «классной доски», используемой в качестве средства связи, возможно и стандартное межпроцессное взаимодействие (IPC), если «классная доска» расположена на одном компьютере с источниками знаний. «Классная доска» — самый простой способ взаимодействия между источниками знаний, хотя в конфигурации размещения «классной доски» на отдельном компьютере можно использовать с этой целью сокеты. В этом случае управление, осуществляемое «классной доской» над источниками знаний, будет более жестким и обусловленным в любой момент времени содержимым «классной доски», а не сообщениями, передаваемыми непосредственно источникам знаний. Прямую пересылку сообщений легче реализовать при использовании «классной доски» в сочетании с PVM-задачами. В этом случае источники знаний сами настраивают себя на основе содержимого «классной доски». Но «классная доска» все же имеет определенный «рычаг»управления источниками знаний, поскольку ей «известны» идентификационные номера всех процессов, содержащих источники знаний. Как модель MPMD (MIMD), так и модель SPMD (SIMD), также поддерживаются использованием функции posix_spawn(). В листинге 13.9 представлен класс, который можно использовать в качестве объекта-функции при выполнении алгоритма for_each ().

>// Листинг 13.9. Использование класса child_process как

>// объекта-функции при запуске источников

>// знаний

>class child_process{

>string Command;

>posix_spawnattr_t M;

>posix_spawn_file_actions_t N;

>pid_t Pid;

>//.. .

>public:

>child_process(void);

>void operator()(string X);

>void spawn(string X);

>};

>void child_process::operator()(string X) {

>//.. .

>posix_spawnattr_init(&M);

>posix_spawn_file_actions_init(&N);

>Command.append("/tmp/");

>Command.append(X);

>char *const argv[] = {const_cast(Command.data()),NULL};

>posix_spawn(&Pid,Command.data(),&N,&M,argv,NULL);

>Command.erase(Command.begin(), Command.end()); //.. .

>}

Мы инкапсулируем атрибуты, необходимые для функции posix_spawn() , в классе child_process. Инкапсуляция всех данных, требуемых для вызова этой функции в классе, упро