我有这个代码,但是它有一个错误:Segmentation Fault(核心转储)并且它不适用于更多2个线程。我知道我做错了什么?
此代码用于通过Leibniz公式计算pi
#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*/
我认为错误已经结束,但我不知道如何解决它
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;
}
答案 0 :(得分:1)
您的错误主要是忘记了变量初始化等简单的事情。在初始化之前访问诸如float *pi;
之类的指针时,它几乎总会导致问题。至少应该引发编译器警告。顺便说一句,打开所有编译器警告。 GCC options
以下是一些清洁构建的具体细节......
1 将return语句添加到calcPi函数
...
return 0;
}
2 使用;
终止struct datos
struct datos {
...
};
^
3 功能:
* calcPi (void *datos){...}
应该是:
void * calcPi (void *datos){...}
或更好:
void calcPi (struct datos *d){...} //passing a struct pointer
4 在使用变量之前初始化变量。例如:
float *pi; //uninitialized
float *pi = NULL;//initialized pointer
pi = malloc(sizeof(float)*NUM_HILOS);//array of pi with NUM_HILOS elements
然后,在以下赋值语句中使用pi [i],...
hilo_datos[i].pi = pi[i];
或 ,只需创建一个简单的浮点数:(在这种情况下你不需要指针)
float pi = 0;//works just fine for what you are doing
//no further initialization is needed
其他问题 包括错误应用线程,创建不适当的变量类型(例如,对于您使用它的方式,float *pi;
可能只是{{ 1}}否定对float pi;
)
使用此算法计算pi(无线程)的一个非常简单的示例包含在下面,用于说明:
malloc()