Многопоточность против многопроцессорности в C - PullRequest
0 голосов
/ 14 апреля 2019

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

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

Например, если я хочу создать 5 потоков в функции, я могу сделать это:

for(i = 0; i < 5; i++) {
    pthread_create(&(myThread[i]), NULL, myFunction, argument); 
}

Как бы я это сделал в процессе? Я подумал о вызове функции, а затем о вызове fork в функции, но я не уверен, как получить конкретный номер. Например, если я сделал это:

myFunction(argument) {
    fork();
    fork();
    fork();
    ...
}

Это дало бы мне 8 всего процесса. Очень много. Но если бы я удалил fork (), у меня было бы всего 4 процесса, что слишком мало. Как бы я создал столько процессов, сколько я хочу?

Далее, если бы я закрыл темы, я бы просто сделал это:

for(i = 0; i < 5; i++){
    pthread_join(myThread[i],NULL);
}

Но как бы я это сделал для процессов?

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

static pthread_mutex_t my_mutex;
pthread_mutex_lock(&my_mutex);
...
pthread_mutex_unlock(&my_mutex);

Могу ли я использовать мьютексы с процессом? Если нет, какая альтернатива есть? Если да, то как будет отличаться его реализация?

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Вы должны проверить возвращаемое значение при вызове fork.Например:

for (int i = 0; i < 4; ++i)
{
  pid_t child = fork();
  if(pid == -1) perror("wtf? "), abort(); // failed!
  if(!pid) {
    // in child process ...:
    do_work();
    exit(0);
  }
}

A -1 возвращаемое значение указывает на ошибку, а 0 указывает на то, что вы находитесь в дочернем процессе.

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

Обратите внимание, что нет необходимости в управлении мьютексом, поскольку родительский процесс и дочерние процессы не совместно используют одну и ту же память.Это также означает, что они должны будут взаимодействовать другими способами (часто используя каналы, сокеты Unix или специально выделенную общую память).

0 голосов
/ 14 апреля 2019

Как бы я создал столько процессов, сколько мне нужно?

Использовать exec семейство API.

Но как мне это сделать для процессов?

wait будет блокировать текущий процесс до выхода из дочернего процесса.

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