Segmentation Fault(core dumped) pthread Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30 pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!Core dumped, but core file is not in the current directory?What is a segmentation fault?Pthread condition variable unpredictable outcomewhat is Segmentation fault (core dumped)?Segmentation fault (core dumped) and zlibpThreads Segmentation Faultphtread_kill() Segmentation fault (core dumped)pthread_create type error. What am i missing?pthread segmentation fault (core dumped) errorCode segmentation fault (core dumped) pthread creation
Was Objective-C really a hindrance to Apple software development?
Why do people think Winterfell crypts is the safest place for women, children & old people?
Writing a T-SQL stored procedure to receive 4 numbers and insert them into a table
Is Bran literally the world's memory?
Is there a way to fake a method response using Mock or Stubs?
What does the black goddess statue do and what is it?
What were wait-states, and why was it only an issue for PCs?
Israeli soda type drink
How to compute a Jacobian using polar coordinates?
What's parked in Mil Moscow helicopter plant?
/bin/ls sorts differently than just ls
What does こした mean?
Are these square matrices always diagonalisable?
Test if all elements of a Foldable are the same
What *exactly* is electrical current, voltage, and resistance?
My admission is revoked after accepting the admission offer
How was Lagrange appointed professor of mathematics so early?
Has a Nobel Peace laureate ever been accused of war crimes?
How would it unbalance gameplay to rule that Weapon Master allows for picking a fighting style?
How can I wire a 9-position switch so that each position turns on one more LED than the one before?
What is the purpose of the side handle on a hand ("eggbeater") drill?
Marquee sign letters
`FindRoot [ ]`::jsing: Encountered a singular Jacobian at a point...WHY
What is the numbering system used for the DSN dishes?
Segmentation Fault(core dumped) pthread
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30 pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!Core dumped, but core file is not in the current directory?What is a segmentation fault?Pthread condition variable unpredictable outcomewhat is Segmentation fault (core dumped)?Segmentation fault (core dumped) and zlibpThreads Segmentation Faultphtread_kill() Segmentation fault (core dumped)pthread_create type error. What am i missing?pthread segmentation fault (core dumped) errorCode segmentation fault (core dumped) pthread creation
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
I have this code but it has an error: Segmentation Fault(core dumped) and it doesn't work with more the 2 threads. Any idea of what am i doing wrong?
This code is for calculate pi by Leibniz formula
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <malloc.h>
#define NUM_HILOS 2
struct datos
int inicio;
int fin;
float *pi;
*calcPi (void *datos)
struct datos *datos_proceso;
datos_proceso = (struct datos *) datos;
int i = datos_proceso -> inicio;
int end = datos_proceso -> fin;
printf("inicio %d n", i);
printf("fin %d n", end);
float *pi = datos_proceso -> pi;
int signo = 1;
do
*pi = *pi +(signo*4.0)/((2*i)+1);
i++;
signo *= -1;
//printf("%f n", *pi);
while(i<end);
int main()
int error, i;
float *pi;
int j = -1;
/*variable para hilos*/
I think that the error is over here but i don't know how to fix it
struct datos hilo_datos[NUM_HILOS];
pthread_t idhilo[NUM_HILOS];
//printf("este es pi %f n", *pi);
for(i=0; i<NUM_HILOS; i++)
hilo_datos[i].inicio =j+1;
hilo_datos[i].fin =j+1000;
hilo_datos[i].pi = pi;
printf("%d n", hilo_datos[i].inicio);
printf("%d n", hilo_datos[i].fin);
j += 1000;
for(i=0; i<NUM_HILOS; i++)
error=pthread_create(&idhilo[i], NULL, (void *)calcPi, &hilo_datos[i]);
for(i=0; i<NUM_HILOS; i++)
pthread_join(idhilo[i], NULL);
printf("este es pi %f n", *pi);
return 0;
c pthreads malloc
|
show 14 more comments
I have this code but it has an error: Segmentation Fault(core dumped) and it doesn't work with more the 2 threads. Any idea of what am i doing wrong?
This code is for calculate pi by Leibniz formula
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <malloc.h>
#define NUM_HILOS 2
struct datos
int inicio;
int fin;
float *pi;
*calcPi (void *datos)
struct datos *datos_proceso;
datos_proceso = (struct datos *) datos;
int i = datos_proceso -> inicio;
int end = datos_proceso -> fin;
printf("inicio %d n", i);
printf("fin %d n", end);
float *pi = datos_proceso -> pi;
int signo = 1;
do
*pi = *pi +(signo*4.0)/((2*i)+1);
i++;
signo *= -1;
//printf("%f n", *pi);
while(i<end);
int main()
int error, i;
float *pi;
int j = -1;
/*variable para hilos*/
I think that the error is over here but i don't know how to fix it
struct datos hilo_datos[NUM_HILOS];
pthread_t idhilo[NUM_HILOS];
//printf("este es pi %f n", *pi);
for(i=0; i<NUM_HILOS; i++)
hilo_datos[i].inicio =j+1;
hilo_datos[i].fin =j+1000;
hilo_datos[i].pi = pi;
printf("%d n", hilo_datos[i].inicio);
printf("%d n", hilo_datos[i].fin);
j += 1000;
for(i=0; i<NUM_HILOS; i++)
error=pthread_create(&idhilo[i], NULL, (void *)calcPi, &hilo_datos[i]);
for(i=0; i<NUM_HILOS; i++)
pthread_join(idhilo[i], NULL);
printf("este es pi %f n", *pi);
return 0;
c pthreads malloc
2
Have you tried using GDB to step through your code? I'm pretty sure Martin is right - hilo_datos is a pointer pointing to a memory space enough for only one datos struct. So hilo_datos[0] I think should work but you segfault at hilo_datos[1]. Maybe you wanted to malloc (sizeof (hilo_datos) * NUM_HILOS)?
– Franco Solleza
Nov 3 '15 at 1:08
1
Should you callmalloc
like thisstruct datos* hilo_datos = (struct datos*) malloc(NUM_HILOS * sizeof (struct datos));)
?
– Fiddling Bits
Nov 3 '15 at 1:10
1
You should learn how to run a program in GDB (or another debugger). That should point you straight to where you're usinghilo_datos[i]
.
– roeland
Nov 3 '15 at 1:26
1
hilo_datos[i].pi = pi;
.pi
is an uninitialised variable. That is, you have not allocated any memory forpi
and then you dereference it within the thread code.
– kaylum
Nov 3 '15 at 2:24
1
Even iffloat *pi
and the memory it pointed to were correctly initialized, it would still be undefined behavior due to unsynchronized writes to it in multiple threads.
– EOF
Nov 3 '15 at 12:29
|
show 14 more comments
I have this code but it has an error: Segmentation Fault(core dumped) and it doesn't work with more the 2 threads. Any idea of what am i doing wrong?
This code is for calculate pi by Leibniz formula
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <malloc.h>
#define NUM_HILOS 2
struct datos
int inicio;
int fin;
float *pi;
*calcPi (void *datos)
struct datos *datos_proceso;
datos_proceso = (struct datos *) datos;
int i = datos_proceso -> inicio;
int end = datos_proceso -> fin;
printf("inicio %d n", i);
printf("fin %d n", end);
float *pi = datos_proceso -> pi;
int signo = 1;
do
*pi = *pi +(signo*4.0)/((2*i)+1);
i++;
signo *= -1;
//printf("%f n", *pi);
while(i<end);
int main()
int error, i;
float *pi;
int j = -1;
/*variable para hilos*/
I think that the error is over here but i don't know how to fix it
struct datos hilo_datos[NUM_HILOS];
pthread_t idhilo[NUM_HILOS];
//printf("este es pi %f n", *pi);
for(i=0; i<NUM_HILOS; i++)
hilo_datos[i].inicio =j+1;
hilo_datos[i].fin =j+1000;
hilo_datos[i].pi = pi;
printf("%d n", hilo_datos[i].inicio);
printf("%d n", hilo_datos[i].fin);
j += 1000;
for(i=0; i<NUM_HILOS; i++)
error=pthread_create(&idhilo[i], NULL, (void *)calcPi, &hilo_datos[i]);
for(i=0; i<NUM_HILOS; i++)
pthread_join(idhilo[i], NULL);
printf("este es pi %f n", *pi);
return 0;
c pthreads malloc
I have this code but it has an error: Segmentation Fault(core dumped) and it doesn't work with more the 2 threads. Any idea of what am i doing wrong?
This code is for calculate pi by Leibniz formula
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <malloc.h>
#define NUM_HILOS 2
struct datos
int inicio;
int fin;
float *pi;
*calcPi (void *datos)
struct datos *datos_proceso;
datos_proceso = (struct datos *) datos;
int i = datos_proceso -> inicio;
int end = datos_proceso -> fin;
printf("inicio %d n", i);
printf("fin %d n", end);
float *pi = datos_proceso -> pi;
int signo = 1;
do
*pi = *pi +(signo*4.0)/((2*i)+1);
i++;
signo *= -1;
//printf("%f n", *pi);
while(i<end);
int main()
int error, i;
float *pi;
int j = -1;
/*variable para hilos*/
I think that the error is over here but i don't know how to fix it
struct datos hilo_datos[NUM_HILOS];
pthread_t idhilo[NUM_HILOS];
//printf("este es pi %f n", *pi);
for(i=0; i<NUM_HILOS; i++)
hilo_datos[i].inicio =j+1;
hilo_datos[i].fin =j+1000;
hilo_datos[i].pi = pi;
printf("%d n", hilo_datos[i].inicio);
printf("%d n", hilo_datos[i].fin);
j += 1000;
for(i=0; i<NUM_HILOS; i++)
error=pthread_create(&idhilo[i], NULL, (void *)calcPi, &hilo_datos[i]);
for(i=0; i<NUM_HILOS; i++)
pthread_join(idhilo[i], NULL);
printf("este es pi %f n", *pi);
return 0;
c pthreads malloc
c pthreads malloc
edited Nov 3 '15 at 1:35
Arturo Ramírez
asked Nov 3 '15 at 0:57
Arturo RamírezArturo Ramírez
93
93
2
Have you tried using GDB to step through your code? I'm pretty sure Martin is right - hilo_datos is a pointer pointing to a memory space enough for only one datos struct. So hilo_datos[0] I think should work but you segfault at hilo_datos[1]. Maybe you wanted to malloc (sizeof (hilo_datos) * NUM_HILOS)?
– Franco Solleza
Nov 3 '15 at 1:08
1
Should you callmalloc
like thisstruct datos* hilo_datos = (struct datos*) malloc(NUM_HILOS * sizeof (struct datos));)
?
– Fiddling Bits
Nov 3 '15 at 1:10
1
You should learn how to run a program in GDB (or another debugger). That should point you straight to where you're usinghilo_datos[i]
.
– roeland
Nov 3 '15 at 1:26
1
hilo_datos[i].pi = pi;
.pi
is an uninitialised variable. That is, you have not allocated any memory forpi
and then you dereference it within the thread code.
– kaylum
Nov 3 '15 at 2:24
1
Even iffloat *pi
and the memory it pointed to were correctly initialized, it would still be undefined behavior due to unsynchronized writes to it in multiple threads.
– EOF
Nov 3 '15 at 12:29
|
show 14 more comments
2
Have you tried using GDB to step through your code? I'm pretty sure Martin is right - hilo_datos is a pointer pointing to a memory space enough for only one datos struct. So hilo_datos[0] I think should work but you segfault at hilo_datos[1]. Maybe you wanted to malloc (sizeof (hilo_datos) * NUM_HILOS)?
– Franco Solleza
Nov 3 '15 at 1:08
1
Should you callmalloc
like thisstruct datos* hilo_datos = (struct datos*) malloc(NUM_HILOS * sizeof (struct datos));)
?
– Fiddling Bits
Nov 3 '15 at 1:10
1
You should learn how to run a program in GDB (or another debugger). That should point you straight to where you're usinghilo_datos[i]
.
– roeland
Nov 3 '15 at 1:26
1
hilo_datos[i].pi = pi;
.pi
is an uninitialised variable. That is, you have not allocated any memory forpi
and then you dereference it within the thread code.
– kaylum
Nov 3 '15 at 2:24
1
Even iffloat *pi
and the memory it pointed to were correctly initialized, it would still be undefined behavior due to unsynchronized writes to it in multiple threads.
– EOF
Nov 3 '15 at 12:29
2
2
Have you tried using GDB to step through your code? I'm pretty sure Martin is right - hilo_datos is a pointer pointing to a memory space enough for only one datos struct. So hilo_datos[0] I think should work but you segfault at hilo_datos[1]. Maybe you wanted to malloc (sizeof (hilo_datos) * NUM_HILOS)?
– Franco Solleza
Nov 3 '15 at 1:08
Have you tried using GDB to step through your code? I'm pretty sure Martin is right - hilo_datos is a pointer pointing to a memory space enough for only one datos struct. So hilo_datos[0] I think should work but you segfault at hilo_datos[1]. Maybe you wanted to malloc (sizeof (hilo_datos) * NUM_HILOS)?
– Franco Solleza
Nov 3 '15 at 1:08
1
1
Should you call
malloc
like this struct datos* hilo_datos = (struct datos*) malloc(NUM_HILOS * sizeof (struct datos));)
?– Fiddling Bits
Nov 3 '15 at 1:10
Should you call
malloc
like this struct datos* hilo_datos = (struct datos*) malloc(NUM_HILOS * sizeof (struct datos));)
?– Fiddling Bits
Nov 3 '15 at 1:10
1
1
You should learn how to run a program in GDB (or another debugger). That should point you straight to where you're using
hilo_datos[i]
.– roeland
Nov 3 '15 at 1:26
You should learn how to run a program in GDB (or another debugger). That should point you straight to where you're using
hilo_datos[i]
.– roeland
Nov 3 '15 at 1:26
1
1
hilo_datos[i].pi = pi;
. pi
is an uninitialised variable. That is, you have not allocated any memory for pi
and then you dereference it within the thread code.– kaylum
Nov 3 '15 at 2:24
hilo_datos[i].pi = pi;
. pi
is an uninitialised variable. That is, you have not allocated any memory for pi
and then you dereference it within the thread code.– kaylum
Nov 3 '15 at 2:24
1
1
Even if
float *pi
and the memory it pointed to were correctly initialized, it would still be undefined behavior due to unsynchronized writes to it in multiple threads.– EOF
Nov 3 '15 at 12:29
Even if
float *pi
and the memory it pointed to were correctly initialized, it would still be undefined behavior due to unsynchronized writes to it in multiple threads.– EOF
Nov 3 '15 at 12:29
|
show 14 more comments
1 Answer
1
active
oldest
votes
Your errors were mainly forgetting simple things like variable initialization. When a pointer such as float *pi;
is accessed before being initialized it will almost always cause problems. At the very least it should have raised a compiler warning. By the way, turn on all your compiler warnings. GCC options
Here are a few specifics to get a clean build...
1 add return statement to calcPi function
...
return 0;
}
2 terminate struct datos with a ;
struct datos
...
;
^
3 function:
* calcPi (void *datos)...
should be:
void * calcPi (void *datos)...
Or better:
void calcPi (struct datos *d)... //passing a struct pointer
4 Initialize your variables before using them. for example:
float *pi; //uninitialized
float *pi = NULL;//initialized pointer
pi = malloc(sizeof(float)*NUM_HILOS);//array of pi with NUM_HILOS elements
then, in following assignment statements use pi[i], ...
hilo_datos[i].pi = pi[i];
Or, just create a simple float: (you do not need a pointer in this case)
float pi = 0;//works just fine for what you are doing
//no further initialization is needed
Other problems include mis-application of threads, creating inappropriate variable types (i.e. for the way you are using it, float *pi;
could just be float pi;
negating the need for malloc()
)
A very simple example of using this algorithm to compute pi (without threading) is included below for illustration:
#include <stdio.h>
#include <stdlib.h>
#define NUM_HILOS 10 //array elements (no threads)
struct datos //modified for use as array, no threads
float pi; //PI
;
void calcPi (struct datos *d)
struct datos *datos_proceso = d;
float pi = datos_proceso[0].pi;
int signo = 1;
int i;
for(i=0;i<NUM_HILOS;i++)
pi = pi + (signo*4.0)/((2*i)+1);
signo *= -1;
d[i].pi = pi; //change values for NUM_HILOS to see how
//values for pi converge here.
int main()
int error, i;
float pi = 0;
int j = -1;
//your comment: I think that the error...
//... (The error you were seeing here was
//caused by an uninitialized float *pi; which has been
//changed to float pi = 0; in this example)
struct datos hilo_datos[NUM_HILOS];
for(i=0; i<NUM_HILOS; i++)
hilo_datos[i].pi = 0; //initialize all to zero
calcPi(hilo_datos);//send array of struct, check all elelments when returned
for(i=0; i<NUM_HILOS; i++)
printf("este es pi %f n", hilo_datos[i].pi);
getchar();
return 0;
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%2f33489725%2fsegmentation-faultcore-dumped-pthread%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
Your errors were mainly forgetting simple things like variable initialization. When a pointer such as float *pi;
is accessed before being initialized it will almost always cause problems. At the very least it should have raised a compiler warning. By the way, turn on all your compiler warnings. GCC options
Here are a few specifics to get a clean build...
1 add return statement to calcPi function
...
return 0;
}
2 terminate struct datos with a ;
struct datos
...
;
^
3 function:
* calcPi (void *datos)...
should be:
void * calcPi (void *datos)...
Or better:
void calcPi (struct datos *d)... //passing a struct pointer
4 Initialize your variables before using them. for example:
float *pi; //uninitialized
float *pi = NULL;//initialized pointer
pi = malloc(sizeof(float)*NUM_HILOS);//array of pi with NUM_HILOS elements
then, in following assignment statements use pi[i], ...
hilo_datos[i].pi = pi[i];
Or, just create a simple float: (you do not need a pointer in this case)
float pi = 0;//works just fine for what you are doing
//no further initialization is needed
Other problems include mis-application of threads, creating inappropriate variable types (i.e. for the way you are using it, float *pi;
could just be float pi;
negating the need for malloc()
)
A very simple example of using this algorithm to compute pi (without threading) is included below for illustration:
#include <stdio.h>
#include <stdlib.h>
#define NUM_HILOS 10 //array elements (no threads)
struct datos //modified for use as array, no threads
float pi; //PI
;
void calcPi (struct datos *d)
struct datos *datos_proceso = d;
float pi = datos_proceso[0].pi;
int signo = 1;
int i;
for(i=0;i<NUM_HILOS;i++)
pi = pi + (signo*4.0)/((2*i)+1);
signo *= -1;
d[i].pi = pi; //change values for NUM_HILOS to see how
//values for pi converge here.
int main()
int error, i;
float pi = 0;
int j = -1;
//your comment: I think that the error...
//... (The error you were seeing here was
//caused by an uninitialized float *pi; which has been
//changed to float pi = 0; in this example)
struct datos hilo_datos[NUM_HILOS];
for(i=0; i<NUM_HILOS; i++)
hilo_datos[i].pi = 0; //initialize all to zero
calcPi(hilo_datos);//send array of struct, check all elelments when returned
for(i=0; i<NUM_HILOS; i++)
printf("este es pi %f n", hilo_datos[i].pi);
getchar();
return 0;
add a comment |
Your errors were mainly forgetting simple things like variable initialization. When a pointer such as float *pi;
is accessed before being initialized it will almost always cause problems. At the very least it should have raised a compiler warning. By the way, turn on all your compiler warnings. GCC options
Here are a few specifics to get a clean build...
1 add return statement to calcPi function
...
return 0;
}
2 terminate struct datos with a ;
struct datos
...
;
^
3 function:
* calcPi (void *datos)...
should be:
void * calcPi (void *datos)...
Or better:
void calcPi (struct datos *d)... //passing a struct pointer
4 Initialize your variables before using them. for example:
float *pi; //uninitialized
float *pi = NULL;//initialized pointer
pi = malloc(sizeof(float)*NUM_HILOS);//array of pi with NUM_HILOS elements
then, in following assignment statements use pi[i], ...
hilo_datos[i].pi = pi[i];
Or, just create a simple float: (you do not need a pointer in this case)
float pi = 0;//works just fine for what you are doing
//no further initialization is needed
Other problems include mis-application of threads, creating inappropriate variable types (i.e. for the way you are using it, float *pi;
could just be float pi;
negating the need for malloc()
)
A very simple example of using this algorithm to compute pi (without threading) is included below for illustration:
#include <stdio.h>
#include <stdlib.h>
#define NUM_HILOS 10 //array elements (no threads)
struct datos //modified for use as array, no threads
float pi; //PI
;
void calcPi (struct datos *d)
struct datos *datos_proceso = d;
float pi = datos_proceso[0].pi;
int signo = 1;
int i;
for(i=0;i<NUM_HILOS;i++)
pi = pi + (signo*4.0)/((2*i)+1);
signo *= -1;
d[i].pi = pi; //change values for NUM_HILOS to see how
//values for pi converge here.
int main()
int error, i;
float pi = 0;
int j = -1;
//your comment: I think that the error...
//... (The error you were seeing here was
//caused by an uninitialized float *pi; which has been
//changed to float pi = 0; in this example)
struct datos hilo_datos[NUM_HILOS];
for(i=0; i<NUM_HILOS; i++)
hilo_datos[i].pi = 0; //initialize all to zero
calcPi(hilo_datos);//send array of struct, check all elelments when returned
for(i=0; i<NUM_HILOS; i++)
printf("este es pi %f n", hilo_datos[i].pi);
getchar();
return 0;
add a comment |
Your errors were mainly forgetting simple things like variable initialization. When a pointer such as float *pi;
is accessed before being initialized it will almost always cause problems. At the very least it should have raised a compiler warning. By the way, turn on all your compiler warnings. GCC options
Here are a few specifics to get a clean build...
1 add return statement to calcPi function
...
return 0;
}
2 terminate struct datos with a ;
struct datos
...
;
^
3 function:
* calcPi (void *datos)...
should be:
void * calcPi (void *datos)...
Or better:
void calcPi (struct datos *d)... //passing a struct pointer
4 Initialize your variables before using them. for example:
float *pi; //uninitialized
float *pi = NULL;//initialized pointer
pi = malloc(sizeof(float)*NUM_HILOS);//array of pi with NUM_HILOS elements
then, in following assignment statements use pi[i], ...
hilo_datos[i].pi = pi[i];
Or, just create a simple float: (you do not need a pointer in this case)
float pi = 0;//works just fine for what you are doing
//no further initialization is needed
Other problems include mis-application of threads, creating inappropriate variable types (i.e. for the way you are using it, float *pi;
could just be float pi;
negating the need for malloc()
)
A very simple example of using this algorithm to compute pi (without threading) is included below for illustration:
#include <stdio.h>
#include <stdlib.h>
#define NUM_HILOS 10 //array elements (no threads)
struct datos //modified for use as array, no threads
float pi; //PI
;
void calcPi (struct datos *d)
struct datos *datos_proceso = d;
float pi = datos_proceso[0].pi;
int signo = 1;
int i;
for(i=0;i<NUM_HILOS;i++)
pi = pi + (signo*4.0)/((2*i)+1);
signo *= -1;
d[i].pi = pi; //change values for NUM_HILOS to see how
//values for pi converge here.
int main()
int error, i;
float pi = 0;
int j = -1;
//your comment: I think that the error...
//... (The error you were seeing here was
//caused by an uninitialized float *pi; which has been
//changed to float pi = 0; in this example)
struct datos hilo_datos[NUM_HILOS];
for(i=0; i<NUM_HILOS; i++)
hilo_datos[i].pi = 0; //initialize all to zero
calcPi(hilo_datos);//send array of struct, check all elelments when returned
for(i=0; i<NUM_HILOS; i++)
printf("este es pi %f n", hilo_datos[i].pi);
getchar();
return 0;
Your errors were mainly forgetting simple things like variable initialization. When a pointer such as float *pi;
is accessed before being initialized it will almost always cause problems. At the very least it should have raised a compiler warning. By the way, turn on all your compiler warnings. GCC options
Here are a few specifics to get a clean build...
1 add return statement to calcPi function
...
return 0;
}
2 terminate struct datos with a ;
struct datos
...
;
^
3 function:
* calcPi (void *datos)...
should be:
void * calcPi (void *datos)...
Or better:
void calcPi (struct datos *d)... //passing a struct pointer
4 Initialize your variables before using them. for example:
float *pi; //uninitialized
float *pi = NULL;//initialized pointer
pi = malloc(sizeof(float)*NUM_HILOS);//array of pi with NUM_HILOS elements
then, in following assignment statements use pi[i], ...
hilo_datos[i].pi = pi[i];
Or, just create a simple float: (you do not need a pointer in this case)
float pi = 0;//works just fine for what you are doing
//no further initialization is needed
Other problems include mis-application of threads, creating inappropriate variable types (i.e. for the way you are using it, float *pi;
could just be float pi;
negating the need for malloc()
)
A very simple example of using this algorithm to compute pi (without threading) is included below for illustration:
#include <stdio.h>
#include <stdlib.h>
#define NUM_HILOS 10 //array elements (no threads)
struct datos //modified for use as array, no threads
float pi; //PI
;
void calcPi (struct datos *d)
struct datos *datos_proceso = d;
float pi = datos_proceso[0].pi;
int signo = 1;
int i;
for(i=0;i<NUM_HILOS;i++)
pi = pi + (signo*4.0)/((2*i)+1);
signo *= -1;
d[i].pi = pi; //change values for NUM_HILOS to see how
//values for pi converge here.
int main()
int error, i;
float pi = 0;
int j = -1;
//your comment: I think that the error...
//... (The error you were seeing here was
//caused by an uninitialized float *pi; which has been
//changed to float pi = 0; in this example)
struct datos hilo_datos[NUM_HILOS];
for(i=0; i<NUM_HILOS; i++)
hilo_datos[i].pi = 0; //initialize all to zero
calcPi(hilo_datos);//send array of struct, check all elelments when returned
for(i=0; i<NUM_HILOS; i++)
printf("este es pi %f n", hilo_datos[i].pi);
getchar();
return 0;
edited Mar 9 at 4:13
answered Nov 6 '15 at 21:04
ryykerryyker
12.7k22959
12.7k22959
add a comment |
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%2f33489725%2fsegmentation-faultcore-dumped-pthread%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
2
Have you tried using GDB to step through your code? I'm pretty sure Martin is right - hilo_datos is a pointer pointing to a memory space enough for only one datos struct. So hilo_datos[0] I think should work but you segfault at hilo_datos[1]. Maybe you wanted to malloc (sizeof (hilo_datos) * NUM_HILOS)?
– Franco Solleza
Nov 3 '15 at 1:08
1
Should you call
malloc
like thisstruct datos* hilo_datos = (struct datos*) malloc(NUM_HILOS * sizeof (struct datos));)
?– Fiddling Bits
Nov 3 '15 at 1:10
1
You should learn how to run a program in GDB (or another debugger). That should point you straight to where you're using
hilo_datos[i]
.– roeland
Nov 3 '15 at 1:26
1
hilo_datos[i].pi = pi;
.pi
is an uninitialised variable. That is, you have not allocated any memory forpi
and then you dereference it within the thread code.– kaylum
Nov 3 '15 at 2:24
1
Even if
float *pi
and the memory it pointed to were correctly initialized, it would still be undefined behavior due to unsynchronized writes to it in multiple threads.– EOF
Nov 3 '15 at 12:29