2013-10-15 3 views
1

Voici mon code. J'essaie d'obtenir le main_thread pour obtenir l'entrée de l'utilisateur, stocker dans global_variable, puis imprimer. Cependant, après l'entrée, mon impression est Erreur de segmentation. Quelqu'un a une idée?C Erreur de segmentation d'impression pthread de programmation

#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

char* global_variable; 

void *first_thread(void *ptr) { 
    printf("%s \n", (char *)ptr); 
    pthread_exit(NULL); 
} 

void *second_thread(void *ptr) { 
    printf("%s \n", (char *)ptr); 
    pthread_exit(NULL); 
} 

void *third_thread(void *ptr) { 
    printf("%s \n", (char *)ptr); 
    pthread_exit(NULL); 
} 

void *main_thread() { 

    printf("Thread 1: Please enter a line of text [Enter \"Exit\" to quit]\n"); 
    fgets(global_variable, 999, stdin); 
    printf("%s", global_variable); 

    pthread_exit(NULL); 
} 

int main() { 

    pthread_t t_m, t1, t2, t3; 

    //const char *m1 = "Thread 1", *m2 = "Thread 1", *m3 = "Thread 3"; 

    int cr1, cr2; 

    //creating threads 
    cr1 = pthread_create(&t_m, NULL, main_thread, NULL); 
    //cr1 = pthread_create(&t1, NULL, first_thread, NULL); 
    //cr1 = pthread_create(&t2, NULL, second_thread, NULL); 
    //cr1 = pthread_create(&t3, NULL, third_thread, NULL); 
    //threads created 

    pthread_join(t_m, NULL); 

    printf("Global Variable: %s", global_variable); 

    exit(0); 
    return 0; 
} 
+0

Je viens de vous vu 2-3 question dans tout le code à créer le premier fil comme fil conducteur, mais généralement un principal le fil est le fil qui exécute le fil principal .....parent de tous. –

+0

votre code commenté semble incorrect. –

Répondre

3

Vous n'êtes pas allouer de la mémoire pour global_variable, donc fgets tente d'écrire à un aléatoire position dans la mémoire, ce qui conduit à l'OS détecter la violation de la mémoire et l'arrêt du processus en envoyant SIGSEGV qui provoque une erreur de segmentation.

Modifiez le votre principal à quelque chose comme ceci:

int main() { 

    pthread_t t_m, t1, t2, t3; 
    global_variable = malloc(sizeof(char)*999); 
    //const char *m1 = "Thread 1", *m2 = "Thread 1", *m3 = "Thread 3"; 

...more code... 

printf("Global Variable: %s", global_variable); 
free(global_variable); 

Lire malloc() et free()

+0

vous suggérez que la question C++ taged seulement C, btw mise en forme correcte –

+0

Ah, raté cela. Je vais nettoyer ça. – dutt

+0

S'il vous plaît mentionner à propos de libérer la mémoire. Et aussi, puisque les autres threads dépendent de la mémoire allouée, vous devez vous assurer qu'il est libéré * après * la mort des threads. –

4

déclaration Note:

char* global_variable; 

est pas un tableau, mais un pointeur, et que vous essayez de lire comme:

fgets(global_variable, 999, stdin); 

sans allouer de la mémoire ==> un comportement non défini, les causes d'erreur de segmentation à l'exécution.

Pour y remédier, que ce soit pour allouer de la mémoire comme @dutt suggère dans son answer, ou global_variable doit être un tableau comme char global_variable[1000];