Многопроцессорные вилки с использованием нескольких функций - PullRequest
0 голосов
/ 03 мая 2018

У меня небольшая проблема с попыткой обернуть голову вокруг разветвления, если родитель должен выполнить более одной функции в двух наборах дочерних процессов.

Этот код будет выполнять функцию () n раз

pid_t = pid;
int n; /* number of child processes*/

    for (i = 0; i < n; ++i) 
    {
        if ((pid = fork()) < 0) 
        {
        /*error handling*/
        }
        else if (pid == 0) 
        {
            function();
            exit(0);
        }
    }
/*Parent waits*/

Как одновременно выполнить другую функцию с другим набором дочерних процессов, исходящих от родителя.

1) родительские вилки n обрабатывают всю выполняющуюся функцию1 ()

2) родитель также разветвляется на другой процесс, выполняющий функцию2 ()

3) Оба набора дочерних элементов выполняются, пока родительский процесс ожидает завершения всех наборов процессов.

1 Ответ

0 голосов
/ 03 мая 2018

Если вы не возражаете против всех процессов для function1 получения fork 'd перед любым из процессов для function2, вы можете просто использовать последовательные циклы:

pid_t pid;
int n, m;

// Create n processes running function1
for (int i = 0; i < n; i++) {
    if (fork() == 0) {
        function1();
        exit();
    }
}

// Create m processes to run function2
for (int i = 0; i < m; i++) {
    if (fork() == 0) {
        function2();
        exit();
    }
}

// Parent waits

Но это не масштабируется, если вы хотите запустить n различных функций.


Масштабируемый ответ будет состоять в том, чтобы использовать массив указателей на функции в сочетании с массивом, содержащим количество повторений выполнения каждой функции.

#define LEN 3

void func1();
void func2();
void func3();

/* f is an array of pointers to each function */
void  (*f[LEN])() = {func1, func2, func3};
/* count contains the number of times each function should be called */
int count[LEN]    = {  1  ,   2  ,   3  };

for (int i = 0; i < LEN; i++) {
    for (int j = 0; j < counts[i]; j++) {
         if (fork() == 0) {
             f[i](); // Call function
             exit();
         }
    }
}

Я пропустил такие вещи, как проверка ошибок, но общая идея состоит в том, чтобы зациклить массив функций и разветвлять требуемое количество раз для каждой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...