C Thread creation tree
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
add a comment |
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
add a comment |
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
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
c multithreading
asked Nov 27 '18 at 10:57
AelarAelar
111
111
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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);
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
addfree(sp)before topthread_exit.
– kiran Biradar
Nov 27 '18 at 11:37
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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);
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
addfree(sp)before topthread_exit.
– kiran Biradar
Nov 27 '18 at 11:37
add a comment |
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);
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
addfree(sp)before topthread_exit.
– kiran Biradar
Nov 27 '18 at 11:37
add a comment |
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);
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);
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
addfree(sp)before topthread_exit.
– kiran Biradar
Nov 27 '18 at 11:37
add a comment |
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
addfree(sp)before topthread_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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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