Многопроцессорные вилки, использующие несколько функций

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

Этот код будет выполнять функцию() 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) Оба набора дочерних процессов выполняются, в то время как родитель ожидает завершения всех наборов процессов.


person Jordan C    schedule 03.05.2018    source источник
comment
Два цикла друг за другом, одно разветвление для function1, а другое разветвление для function2?   -  person Some programmer dude    schedule 03.05.2018
comment
Или локальная переменная, увеличивающаяся в каждом цикле, когда четное значение cal function1, когда нечетное function2   -  person Serge Ballesta    schedule 03.05.2018


Ответы (1)


Если вы не возражаете против того, чтобы все процессы для function1 получали fork перед любым из процессов для 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();
         }
    }
}

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

person Increasingly Idiotic    schedule 03.05.2018