Усреднение вывода нескольких процессов в C - PullRequest
1 голос
/ 20 марта 2020

Я искал вокруг топи c, но меня немного смущает количество различных техник, и я не уверен, как подойти к моей проблеме.

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

Довольно просто в теории, но я понятия не имею, как это сделать - кажется, что простым способом было бы просто сделать что-то вроде

loop that creates pipes
if (fork())
    loop that reads the outputs of pipes
else
    code of function that computes the desired value

, но это как-то кажется неправильным? Я действительно не уверен, как это сделать

РЕДАКТИРОВАТЬ: Чтобы адресовать комментарии, я думал о чем-то вроде этого:

    for (int i = 0; i < n_children; ++i) {
        if (fork() == 0) { //child process
            x += estimation();
        }
    }
    for (int i = 0; i < n_children; ++i)    //waiting for each process to end
        wait(NULL);

    x /= n_children;

, но я знаю, что это не будет работать правильно, я не знаю, как сохранить / синхронизировать результаты

1 Ответ

0 голосов
/ 20 марта 2020

Как Уильям Перселл , упомянутый в комментариях, вам нужен только один канал Родитель закроет конец записи, а каждый разветвленный потомок закроет конец чтения. Каждый ребенок записывает свой результат в трубу. Родитель вызывает wait (2) для каждого дочернего элемента и, если состояние указывает, что данные были записаны в канал, считывает канал и обновляет среднее значение.

Это также можно сделать с помощью анонимной общей памяти Posix. Выделите массив результатов в общей памяти. Каждый дочерний элемент будет иметь уникальное значение переменной l oop i при создании своего процесса. Ребенок пишет на array[i]. Родитель ждет каждого ребенка. Когда все они завершены, переберите массив и вычислите.

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