2013-10-15 101 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的問題,從你在所有的代碼創建第一線爲主線,但通常是主線程是所有運行main..parent線程的線程。 –

+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,順便說一句格式正確 –

+0

啊,錯過了。我會清理它。 – dutt

+0

請提及關於釋放內存。而且,由於其他線程依賴於分配的內存,因此您需要確保它在線程死後釋放*。 –

4

注聲明:

char* global_variable; 

不是一個數組而是一個指針,你正在試圖爲已讀:

fgets(global_variable, 999, stdin); 

不分配內存==>不確定的行爲,原因在運行時出現分段故障。

要糾正它,要麼爲它分配內存@dutt在他answer暗示,或global_variable應該是一個數組作爲char global_variable[1000];