Дизайн программы
Моя программа разработана таким образом, что создано 6 дочерних процессов. Каждый дочерний процесс создаст 3 потока. Итак, всего должно быть 18 тем.
Когда я создаю дочерний процесс, он вызывает функцию createThread и передает ей childIndex этой итерации (ie, 0, 1, 2, 3, 4, 5).
Когда функция выполняется, она должна:
- Сохранить дочерний PID в элементе pid в структуре childThreads.
- Go в a для l oop и создать поток 3 раза и сохраните его идентификатор потока в элементе tid той же структуры
- Распечатайте результаты, чтобы убедиться, что все работает.
Моя проблема:
Когда дочерний индекс находится на своей первой итерации (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);
}
}