2014-04-24 2 views
-2

Je faisais de l'histogramme en utilisant pthreads et après une longue lutte dessus .. enfin il est écrit 'Segmentation Fault (Core Dumped)'. malheureusement j'ai eu cette ligne p = (struct1 *) malloc (sizeof (struct1)); après avoir obtenu les valeurs aux variables struct à partir de la ligne de commande .. Donc cela a été effacé .. Merci pour @DNT pour me le faire savoir ..Défaut de segmentation (core dumped) Programmation pthreads C Histogramme

Maintenant, quand j'essaie d'exécuter le programme suivant .. Il affiche parfois le sortie et parfois il va à la fonction which_bin et imprime le suivant

sortie type 1 (qui n'est pas la bonne sortie): Données = 0.000000 n'appartient pas à une poubelle! Quitting

type de sortie 2 (presque la sortie correcte de l'histo avec le temps pris par des fils): 10,000 à 28,000: 28,000 à 46,000: 46,000 à 64,000: 64,000 à 82,000: 82,000 à 100,000: XXXXXXXXXX le code à chronométré a pris 0.000415 secondes

mon est pourquoi les ques même prog lorsque RAN montre différentes sorties .. Je suis confus de ce qu'il est à la recherche exactement ..

Voici mon code ..

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include "timer.h" 
void Usage(char prog_name[]); 



//void Get_args(void *p); 
void Gen_data(void *p); 
void Gen_bins(void *p); 
int Which_bin(void *p); 
void Print_histo(void *p); 


void func(void *p); 

struct test 
{ 
    int bin_count, i, bin; 
    float min_meas, max_meas; 
    float* bin_maxes; 
    int* bin_counts; 
    int data_count; 
    float* data; 
}; 

typedef struct test struct1; 

int main(int argc, char* argv[]) 
{ 
    double start, finish, elapsed; 
    GET_TIME(start); 

    struct1 *p; 
    pthread_t th1, th2, th3; 

    p=(struct1 *)malloc(sizeof(struct1)); 
    if (argc != 5) 
     Usage(argv[0]); 
    p->bin_count = strtol(argv[1], NULL, 10); 
    p->min_meas = strtof(argv[2], NULL); 
    p->max_meas = strtof(argv[3], NULL); 
    p->data_count = strtol(argv[4], NULL, 10); 

    p->bin_maxes = malloc(p->bin_count*sizeof(float)); 
    p->bin_counts = malloc(p->bin_count*sizeof(int)); 
    p->data = malloc(p->data_count*sizeof(float)); 


    pthread_create(&th1,NULL,(void*) Gen_data,(void*) p); 
    pthread_create(&th2,NULL,(void*) Gen_bins,(void*) p); 
    pthread_create(&th3,NULL,(void*) func,(void*) p); 
    printf("Hi\n"); 


    pthread_join(th1,NULL); 
    pthread_join(th2,NULL); 
    pthread_join(th3,NULL); 


    Print_histo(p); 
    free(p->data); 
    free(p->bin_maxes); 
    free(p->bin_counts); 

    GET_TIME(finish); 
    elapsed = finish - start; 
    printf("The code to be timed took %f seconds\n", elapsed); 
    return 0; 
} /* main */ 

void func(void *p) 
{ 
    int i; 
    struct1 *args; 
    args=(struct1*)p; 

    for (i = 0; i < args->data_count; i++) 
    { 
     args->bin = Which_bin(args); 
     args->bin_counts[args->bin]++; 
    } 

    # ifdef DEBUG 
     printf("bin_counts = "); 
     for (i = 0; i < args->bin_count; i++) 
      printf("%d ", args->bin_counts[i]); 
     printf("\n"); 
    # endif 
} 

/*--------------------------------------------------------------------- 
* Function: Usage 
* Purpose: Print a message showing how to run program and quit 
* In arg: prog_name: the name of the program from the command line 
*/ 
void Usage(char prog_name[] /* in */) 
{ 
    fprintf(stderr, "usage: %s ", prog_name); 
    fprintf(stderr, "<bin_count> <min_meas> <max_meas> <data_count>\n"); 
    exit(0); 
} /* Usage */ 


void Gen_data(void *p) 
{ 
    struct1 *args; 
    args=(struct1*)p; 
    int i; 
    srandom(0); 
    for (i = 0; i < args->data_count; i++) 
     args->data[i] = args->min_meas + (args->max_meas - args->min_meas)*random()/((double) RAND_MAX); 

    #ifdef DEBUG 
     printf("data = "); 
     for (i = 0; i < args->data_count; i++) 
      printf("%4.3f ", args->data[i]); 
     printf("\n"); 
    #endif 
} /* Gen_data */ 


void Gen_bins(void* p) 
{ 
    struct1 *args; 
    args=(struct1*)p; 
    float bin_width; 
    int i; 
    bin_width = (args->max_meas - args->min_meas)/args->bin_count; 

    for (i = 0; i < args->bin_count; i++) 
    { 
     args->bin_maxes[i] = args->min_meas + (i+1)*bin_width; 
     args->bin_counts[i] = 0; 
    } 

    # ifdef DEBUG 
     printf("bin_maxes = "); 
     for (i = 0; i < args->bin_count; i++) 
      printf("%4.3f ", args->bin_maxes[i]); 
     printf("\n"); 
    # endif 
} 

int Which_bin(void* p) 
{ 
    struct1 *args; 
    args=(struct1*)p; 
    int bottom = 0, top = args->bin_count-1; 
    int mid; 
    float bin_max, bin_min; 

    while (bottom <= top) 
    { 
     mid = (bottom + top)/2; 
     bin_max = args->bin_maxes[mid]; 
     bin_min = (mid == 0) ? args->min_meas: args->bin_maxes[mid-1]; 
     if (*(args->data) >= bin_max) 
      bottom = mid+1; 
     else if (*(args->data) < bin_min) 
      top = mid-1; 
     else 
      return mid; 
    } 
    fprintf(stderr, "Data = %f doesn't belong to a bin!\n", args->data); 
    fprintf(stderr, "Quitting\n"); 
    exit(-1); 
} 

void Print_histo(void *p) 
{ 
    struct1 *args; 
    args=(struct1*)p; 
    int i, j; 
    float bin_max, bin_min; 

    for (i = 0; i < args->bin_count; i++) 
    { 
     bin_max = args->bin_maxes[i]; 
     bin_min = (i == 0) ? args->min_meas: args->bin_maxes[i-1]; 
     printf("%.3f-%.3f:\t", bin_min, bin_max); 
     for (j = 0; j < args->bin_counts[i]; j++) 
      printf("X"); 
     printf("\n"); 
    } 
} 

/* Print_histo */ 

Je voudrais savoir si le programme est logiquement incorrect? si c'est incorrect logiquement dans ce cas, pourquoi montre-t-il parfois la sortie de l'histogramme? Merci!

+5

Veuillez utiliser un débogueur pour affiner votre problème. – Mat

+1

Vous devez apprendre les bases de C avant de faire une programmation avancée telle que le multi-threading. Si vous lisez votre programme depuis main() et vers le bas, vous devriez être capable de trouver le bug en quelques secondes. – Lundin

Répondre

1

Que diriez-vous déplacer cette ligne

p=(struct1 *)malloc(sizeof(struct1)); 

avant 'p' est utilisé pour répartir les membres.

+0

Merci! maintenant je ne vois pas la faute de segmentation (core dumped) .. et pas la sortie correcte aussi :) Je dois recommencer mon combat sur ce point :) – Deepak

+0

Vous pouvez vérifier la logique dans votre code avec soin depuis le début, et assurez-vous qu'il fait réellement ce que vous voulez qu'il fasse. Une façon consiste à exécuter chaque routine par lui-même sans threads pour voir si cela fonctionne, et à la fin lorsque vous avez vérifié l'exactitude, remettez tout ensemble :) – DNT

+0

Tout d'abord j'ai créé le programme d'histogramme série et puis quand j'ai vu l'exactitude de cela .. alors j'ai commencé avec pthreads .. merci! – Deepak

Questions connexes