2013-10-15 3 views
1

Ниже приведен мой код. Я пытаюсь получить main_thread, чтобы получить пользовательский ввод, сохранить в global_variable, а затем распечатать. Однако после ввода ввода моя распечатка - это ошибка сегментации. У кого-нибудь есть идеи?C Запрограммированная ошибка сегментации печати pthread

#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

Я только что видел 2-3 вопроса от вас во всем коде вы создаете первую нить в качестве основного потока, но обычно главным thread - это поток, который запускает основной. –

+0

Ваш комментарий отключен. –

ответ

3

Вы не выделения памяти для global_variable, поэтому fgets пытается писать на случайный положение в памяти, что приводит к обнаружению памяти ОС и прекращению процесса, отправив SIGSEGV, который вызывает ошибку сегментации.

Измените ваш главный на что-то вроде этого:

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); 

Читать malloc() и free()

+0

вы предлагаете вопрос C++, заданный только C, btw правильное форматирование –

+0

А, пропустил это. Я уберу это. – dutt

+0

Обратите внимание на освобождение памяти. А также, поскольку другие потоки полагаются на выделенную память, вам нужно убедиться, что она выпущена * после того, как нити умирают. –

4

Примечание декларация:

char* global_variable; 

не является массивом, но указатель, и вы пытаетесь читать:

fgets(global_variable, 999, stdin); 

без выделения памяти ==> Неопределенное поведение, причины ошибки сегментации во время выполнения.

Чтобы исправить это, либо выделить память для него как @dutt предполагая в Его answer или global_variable должен быть массив, как char global_variable[1000];