Несколько разветвляют () Параллелизм

В C++

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

я избегаю указателей как можно больше и вместо этого использую ссылки, тот способ, которым я не должен помещать создание помех if (NULL!=p) - операторы в моем коде.

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

я также избегаю использования ПЕРЕХОДНЫХ ПРИСТАВОК и вместо этого использую STL/повышение как можно больше для предотвращения утечек мадам и других противных вещей. Однако я действительно избегаю использования слишком много пользовательские определенные шаблоны, поскольку я нахожу, что они трудно отлаживают, специально для других, которые не написали код.

6
задан Brock Woolf 4 September 2009 в 20:03
поделиться

4 ответа

Вызов fork () в цикле:

Добавление кода для ожидания дочерних элементов в соответствии с комментариями:

int numberOfChildren = 10;
pid_t *childPids = NULL;
pid_t p;

/* Allocate array of child PIDs: error handling omitted for brevity */
childPids = malloc(numberOfChildren * sizeof(pid_t));

/* Start up children */
for (int ii = 0; ii < numberOfChildren; ++ii) {
   if ((p = fork()) == 0) {
      // Child process: do your work here
      exit(0);
   }
   else {
      childPids[ii] = p;
   }
}

/* Wait for children to exit */
int stillWaiting;
do {
   stillWaiting = 0;
    for (int ii = 0; ii < numberOfChildren; ++ii) {
       if (childPids[ii] > 0) {
          if (waitpid(childPids[ii], NULL, WNOHANG) != 0) {
             /* Child is done */
             childPids[ii] = 0;
          }
          else {
             /* Still waiting on this child */
             stillWaiting = 1;
          }
       }
       /* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */
       sleep(0);
    }
} while (stillWaiting);

/* Cleanup */
free(childPids);
15
ответ дан 8 December 2019 в 05:56
поделиться

Когда вы отключаете процессы, БУДЕТ работать одновременно. Но учтите, что если у вас нет достаточного количества доступных простаивающих процессоров, они могут не работать одновременно, что на самом деле не имеет значения ...

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

4
ответ дан 8 December 2019 в 05:56
поделиться

Просто зацикливайтесь на «главном» процессе, порождая одного дочернего процесса за другим, каждому назначайте определенную задачу.

3
ответ дан 8 December 2019 в 05:56
поделиться

Вы также можете изучить потоки POSIX (или pthreads). Вот руководство:

https://computing.llnl.gov/tutorials/pthreads/

0
ответ дан 8 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: