分段错误(核心转储)pthread

时间:2015-11-03 00:57:38

标签: c pthreads malloc

我有这个代码,但是它有一个错误: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;
}

1 个答案:

答案 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()