В C++
я распространился, утверждает на всем протяжении моих функций, особенно в запуске и конце функций для ловли любого неожиданного ввода/вывода. Когда я позже добавлю больше функциональности в функции, утверждение поможет мне помнить. Это также помогает другим людям видеть намерение функции и только активно в режиме отладки.
я избегаю указателей как можно больше и вместо этого использую ссылки, тот способ, которым я не должен помещать создание помех if (NULL!=p)
- операторы в моем коде.
я также использую Word const
так часто, как я могу и в объявлениях и как функция/аргументы метода.
я также избегаю использования ПЕРЕХОДНЫХ ПРИСТАВОК и вместо этого использую STL/повышение как можно больше для предотвращения утечек мадам и других противных вещей. Однако я действительно избегаю использования слишком много пользовательские определенные шаблоны, поскольку я нахожу, что они трудно отлаживают, специально для других, которые не написали код.
Вызов 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);
Когда вы отключаете процессы, БУДЕТ работать одновременно. Но учтите, что если у вас нет достаточного количества доступных простаивающих процессоров, они могут не работать одновременно, что на самом деле не имеет значения ...
Из вашего второго абзаца кажется, что вы не понимаете, как работает форк, вам нужно проверьте код возврата, чтобы узнать, находитесь ли вы в родительском процессе или в разветвленном процессе. Таким образом, родительский элемент запускает цикл для разделения 10 процессов, а в дочерних процессах вы делаете все, что хотите, одновременно.
Просто зацикливайтесь на «главном» процессе, порождая одного дочернего процесса за другим, каждому назначайте определенную задачу.
Вы также можете изучить потоки POSIX (или pthreads). Вот руководство: