C Создание дерева потоков

Aelar спросил: 03 ноября 2018 в 09:17 в: c

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

Я отказался от использования malloc и подобных программ, потому что заблудился в ошибках и теперь я работаю с массивами фиксированного размера. Но все же я получаю ошибки segfault, и даже использование valgrind на самом деле не помогает. Теоретически я должен быть в состоянии сделать это только с помощью pthread_create (без атрибутов), но я очень запутался, вы можете помочь мне выяснить, где происходит утечка памяти результаты Valgrind в основном включают строки "copy from tS", но я не понимаю, где будет проблема.

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

Я прилагаю код

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <math.h>int maxDepth;typedef struct {
    int d;
    pthread_t *b;
} tS;void *tF (void *svp) {
    tS *sp, s, t[2];
    int d, i;
    pthread_t branch[maxDepth], mythread;    /*get the struct*/
    sp = (tS *) svp;
    s = *sp;    /*copy tS values*/
    d=s.d;
    for (i =0; i< d; i++) {
        branch[i]=s.b[i];
    }    /*iterate or print*/
    if (d < maxDepth) {
        for (i=0; i<2; i++) {
            t[i].d = d+1;
            t[i].b = branch;
            t[i].b[d] = pthread_self();
            pthread_create(&mythread, NULL, tF, (void *) &t[i]);
        }
    } else {
        printf("Thread tree: ");
        for (i =0; i< maxDepth; i++) {
            printf("%ld ", branch[i]);
        }
        putchar('\n');
    }    pthread_exit(NULL);
}int main(int argc, char **argv) {
    maxDepth = atoi(argv[1]);    int i;
    pthread_t branch[maxDepth];
    pthread_t mythread;
    tS t[2];    for (i=0; i<2; i++) {
        t[i].d = 1;
        t[i].b= branch;
        t[i].b[0] = pthread_self(); 
        pthread_create(&mythread, NULL, tF, (void *) &t[i]);
    }
    pthread_exit(NULL);
    return 0;}

0 ответов