C Thread creation tree












2















I'm trying to generate a tree of threads, in which each thread creates two more and so on. Reached the tree end (command line arg) I need to print the branch backwards.



I gave up using malloc and similar because I was getting lost in the errors and I'm now working with fixed sized arrays. But still I get segfault errors and even using valgrind is not really helping.
In theory I should be able to do this only using pthread_create (with no attributes) but I'm getting very confused, can you help me figure out where the memory leaks are happening?
Valgrind results mostly include the "copy from tS" lines, but I don't understand where the issue would be.



I'm really not an expert so I wouldn't exclude to be making some stupid mistake, thank you for the patience.



I attach the code



#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;

}









share|improve this question



























    2















    I'm trying to generate a tree of threads, in which each thread creates two more and so on. Reached the tree end (command line arg) I need to print the branch backwards.



    I gave up using malloc and similar because I was getting lost in the errors and I'm now working with fixed sized arrays. But still I get segfault errors and even using valgrind is not really helping.
    In theory I should be able to do this only using pthread_create (with no attributes) but I'm getting very confused, can you help me figure out where the memory leaks are happening?
    Valgrind results mostly include the "copy from tS" lines, but I don't understand where the issue would be.



    I'm really not an expert so I wouldn't exclude to be making some stupid mistake, thank you for the patience.



    I attach the code



    #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;

    }









    share|improve this question

























      2












      2








      2








      I'm trying to generate a tree of threads, in which each thread creates two more and so on. Reached the tree end (command line arg) I need to print the branch backwards.



      I gave up using malloc and similar because I was getting lost in the errors and I'm now working with fixed sized arrays. But still I get segfault errors and even using valgrind is not really helping.
      In theory I should be able to do this only using pthread_create (with no attributes) but I'm getting very confused, can you help me figure out where the memory leaks are happening?
      Valgrind results mostly include the "copy from tS" lines, but I don't understand where the issue would be.



      I'm really not an expert so I wouldn't exclude to be making some stupid mistake, thank you for the patience.



      I attach the code



      #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;

      }









      share|improve this question














      I'm trying to generate a tree of threads, in which each thread creates two more and so on. Reached the tree end (command line arg) I need to print the branch backwards.



      I gave up using malloc and similar because I was getting lost in the errors and I'm now working with fixed sized arrays. But still I get segfault errors and even using valgrind is not really helping.
      In theory I should be able to do this only using pthread_create (with no attributes) but I'm getting very confused, can you help me figure out where the memory leaks are happening?
      Valgrind results mostly include the "copy from tS" lines, but I don't understand where the issue would be.



      I'm really not an expert so I wouldn't exclude to be making some stupid mistake, thank you for the patience.



      I attach the code



      #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;

      }






      c multithreading






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 27 '18 at 10:57









      AelarAelar

      111




      111
























          1 Answer
          1






          active

          oldest

          votes


















          0














          One problem is



          tS t[2];
          pthread_t branch[maxDepth];


          are local variable and will destroyed once control exits the function since you don't have join anywhere.



          And you are passing the same variables as argument to pthread_create().



            for (i=0; i<2; i++) {
          t[i].d = d+1;
          t[i].b = branch; // Here
          t[i].b[d] = pthread_self();
          pthread_create(&mythread, NULL, tF, (void *) &t[i]); //and here
          }


          What you can try is dynamically allocate.



             tS *t = malloc(sizoeof(*t)*2);
          t[i].b = malloc(sizeof(pthread_t)*maxDepth);





          share|improve this answer
























          • Hey, thanks. I was not using join because (being a kind of assignment) the task was not asking for it. Now I tried to add it and indeed the segfault disappear. Just a question, if I use the malloc option, where would I free that memory without messing everything up?

            – Aelar
            Nov 27 '18 at 11:32











          • add free(sp) before to pthread_exit.

            – kiran Biradar
            Nov 27 '18 at 11:37













          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53498133%2fc-thread-creation-tree%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          One problem is



          tS t[2];
          pthread_t branch[maxDepth];


          are local variable and will destroyed once control exits the function since you don't have join anywhere.



          And you are passing the same variables as argument to pthread_create().



            for (i=0; i<2; i++) {
          t[i].d = d+1;
          t[i].b = branch; // Here
          t[i].b[d] = pthread_self();
          pthread_create(&mythread, NULL, tF, (void *) &t[i]); //and here
          }


          What you can try is dynamically allocate.



             tS *t = malloc(sizoeof(*t)*2);
          t[i].b = malloc(sizeof(pthread_t)*maxDepth);





          share|improve this answer
























          • Hey, thanks. I was not using join because (being a kind of assignment) the task was not asking for it. Now I tried to add it and indeed the segfault disappear. Just a question, if I use the malloc option, where would I free that memory without messing everything up?

            – Aelar
            Nov 27 '18 at 11:32











          • add free(sp) before to pthread_exit.

            – kiran Biradar
            Nov 27 '18 at 11:37


















          0














          One problem is



          tS t[2];
          pthread_t branch[maxDepth];


          are local variable and will destroyed once control exits the function since you don't have join anywhere.



          And you are passing the same variables as argument to pthread_create().



            for (i=0; i<2; i++) {
          t[i].d = d+1;
          t[i].b = branch; // Here
          t[i].b[d] = pthread_self();
          pthread_create(&mythread, NULL, tF, (void *) &t[i]); //and here
          }


          What you can try is dynamically allocate.



             tS *t = malloc(sizoeof(*t)*2);
          t[i].b = malloc(sizeof(pthread_t)*maxDepth);





          share|improve this answer
























          • Hey, thanks. I was not using join because (being a kind of assignment) the task was not asking for it. Now I tried to add it and indeed the segfault disappear. Just a question, if I use the malloc option, where would I free that memory without messing everything up?

            – Aelar
            Nov 27 '18 at 11:32











          • add free(sp) before to pthread_exit.

            – kiran Biradar
            Nov 27 '18 at 11:37
















          0












          0








          0







          One problem is



          tS t[2];
          pthread_t branch[maxDepth];


          are local variable and will destroyed once control exits the function since you don't have join anywhere.



          And you are passing the same variables as argument to pthread_create().



            for (i=0; i<2; i++) {
          t[i].d = d+1;
          t[i].b = branch; // Here
          t[i].b[d] = pthread_self();
          pthread_create(&mythread, NULL, tF, (void *) &t[i]); //and here
          }


          What you can try is dynamically allocate.



             tS *t = malloc(sizoeof(*t)*2);
          t[i].b = malloc(sizeof(pthread_t)*maxDepth);





          share|improve this answer













          One problem is



          tS t[2];
          pthread_t branch[maxDepth];


          are local variable and will destroyed once control exits the function since you don't have join anywhere.



          And you are passing the same variables as argument to pthread_create().



            for (i=0; i<2; i++) {
          t[i].d = d+1;
          t[i].b = branch; // Here
          t[i].b[d] = pthread_self();
          pthread_create(&mythread, NULL, tF, (void *) &t[i]); //and here
          }


          What you can try is dynamically allocate.



             tS *t = malloc(sizoeof(*t)*2);
          t[i].b = malloc(sizeof(pthread_t)*maxDepth);






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 27 '18 at 11:21









          kiran Biradarkiran Biradar

          5,4922926




          5,4922926













          • Hey, thanks. I was not using join because (being a kind of assignment) the task was not asking for it. Now I tried to add it and indeed the segfault disappear. Just a question, if I use the malloc option, where would I free that memory without messing everything up?

            – Aelar
            Nov 27 '18 at 11:32











          • add free(sp) before to pthread_exit.

            – kiran Biradar
            Nov 27 '18 at 11:37





















          • Hey, thanks. I was not using join because (being a kind of assignment) the task was not asking for it. Now I tried to add it and indeed the segfault disappear. Just a question, if I use the malloc option, where would I free that memory without messing everything up?

            – Aelar
            Nov 27 '18 at 11:32











          • add free(sp) before to pthread_exit.

            – kiran Biradar
            Nov 27 '18 at 11:37



















          Hey, thanks. I was not using join because (being a kind of assignment) the task was not asking for it. Now I tried to add it and indeed the segfault disappear. Just a question, if I use the malloc option, where would I free that memory without messing everything up?

          – Aelar
          Nov 27 '18 at 11:32





          Hey, thanks. I was not using join because (being a kind of assignment) the task was not asking for it. Now I tried to add it and indeed the segfault disappear. Just a question, if I use the malloc option, where would I free that memory without messing everything up?

          – Aelar
          Nov 27 '18 at 11:32













          add free(sp) before to pthread_exit.

          – kiran Biradar
          Nov 27 '18 at 11:37







          add free(sp) before to pthread_exit.

          – kiran Biradar
          Nov 27 '18 at 11:37






















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53498133%2fc-thread-creation-tree%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Lallio

          Unable to find Lightning Node

          Futebolista