Дочерний процесс не выполняет функцию после первой итерации - PullRequest
0 голосов
/ 27 февраля 2020

Дизайн программы

Моя программа разработана таким образом, что создано 6 дочерних процессов. Каждый дочерний процесс создаст 3 потока. Итак, всего должно быть 18 тем.

Когда я создаю дочерний процесс, он вызывает функцию createThread и передает ей childIndex этой итерации (ie, 0, 1, 2, 3, 4, 5).

Когда функция выполняется, она должна:

  1. Сохранить дочерний PID в элементе pid в структуре childThreads.
  2. Go в a для l oop и создать поток 3 раза и сохраните его идентификатор потока в элементе tid той же структуры
  3. Распечатайте результаты, чтобы убедиться, что все работает.

Моя проблема:

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

Ожидаемый вывод:

childThread[0].pid = 1111
childThread[0].tid[0] = 0
childThread[0].tid[1] = 1
childThread[0].tid[2] = 2

childThread[1].pid = 2222
childThread[1].tid[0] = 0
childThread[1].tid[1] = 1
childThread[1].tid[2] = 2
...
..
.

Фактический вывод:

childThread[0].pid = 1111
childThread[0].tid[0] = 0
childThread[0].tid[1] = 1
childThread[0].tid[2] = 2

childThread[1].pid = 2222
childThread[2].pid = 3333
childThread[3].pid = 4444
childThread[4].pid = 5555
childThread[5].pid = 6666

Мой код

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/sysinfo.h>

int numChild = 6;
int numThreadsPerChild = 3;

struct childAndThreads {

    pid_t pid;
    pthread_t *tids;
};

struct childAndThreads *childThread;
pid_t *pids;

void createThreads(int i) {

    int childIndex = i;
    childThread[childIndex].pid = getpid();

    printf("childThread[%d].pid = %d\n", childIndex, childThread[childIndex].pid);

    for(int i = 0; i < numThreadsPerChild; i++) {

        childThread[childIndex].tids[i] = i;
    }

    for(int i = 0; i < numThreadsPerChild; i++) {

        printf("childThread[%d].tid[%d] = %d\n", childIndex, i, i);
    }
}

int main() {

    pids = malloc(numChild * sizeof(pid_t));

    childThread = malloc(numChild * sizeof(struct childAndThreads));
    childThread->tids = malloc(numThreadsPerChild * sizeof(pthread_t));

    for(int i = 0; i < numChild; i++) {

        switch(pids[i] = fork()) {
            case 0:
                createThreads(i);
                return 0;
            case -1:
                printf("Fork Error\n");
                break;
            default:
                //I am a parent
                break;
        }
     }

    for(int i = 0; i < numChild; i++) {
        wait(NULL);
    }
}

1 Ответ

1 голос
/ 27 февраля 2020
childThread->tids = malloc(numThreadsPerChild * sizeof(pthread_t));

Эта строка неверна. Он выделяет tids только для первого дочернего процесса. Вместо этого должно быть:

for (int i = 0; i < numChild; i++) {
    childThread[i].tids = malloc(numThreadsPerChild * sizeof(pthread_t));
}
...