2015-05-09 38 views
1

我寫了一個小程序,用於從用戶讀取兩個數字,並使用線程函數計算它們的總和,該線程函數還負責在屏幕上顯示結果。使用線程計算兩個數字的總和

int global[2]; 

void *sum_thread(void *arg) 
{ 
    int *args_array; 
    args_array = *(int**)arg; 

    int n1,n2,sum; 
    n1=args_array[0]; 
    n2=args_array[1]; 
    sum = n1+n2; 

    printf("N1 + N2 = %d\n",sum); 

    return NULL; 
} 

int main() 
{ 
    printf("First number: "); 
    scanf("%d",&global[0]); 

    printf("Second number: "); 
    scanf("%d",&global[1]); 

    pthread_t tid_sum; 
    pthread_create(&tid_sum,NULL,sum_thread,(void*)&global); 
    pthread_join(tid_sum,NULL); 

    return 0; 
} 

但是,當我運行代碼時,由於分段錯誤而無法正常工作。我想我試圖訪問/使用未分配的內存。我應該用malloc來分配還是還有其他的事情我做錯了?

回答

2

該數組的名稱,global指向該數組的基地址。你可以簡單地通過它並在你的線程函數中使用它。

然而,只提一個邏輯點,如果你傳遞global作爲參數傳遞給sum_thread()功能,它不必是全球

在你的代碼,改變

pthread_create(&tid_sum,NULL,sum_thread,(void*)&global); 

pthread_create(&tid_sum,NULL,sum_thread,global); 

然後,在sum_thread()功能

args_array = *(int**)arg; 

args_array = arg; 
+0

謝謝,完美的工作。爲了真正理解我已經改變了什麼,能否請你解釋一下爲什麼我不需要在將它作爲參數傳遞給線程@SouravGhosh時將其全局化? –

+0

@CarlosPereira這不是關於鑄造_global_,鑄造根本就不是必需的。它會隱含在'C'中。 –

+0

好吧,我現在明白了。這是否適用於我想通過@SouravGhosh的任何類型的參數? –

0

您通過(void*)&global作爲線程啓動函數的參數。 &global的類型是(*)int [2] - 指向兩個int的數組的指針。這與int **不同並且不兼容,它是指向int的指針。數組不是指針。

@SouravGhosh已經提供了一個解決方案,可以正確輸入,並且應該可以正常工作。然而,我觀察到,在這種特殊情況下,將指針傳遞到全局數組有點愚蠢,因爲線程可能直接讀取數組:

void *sum_thread(void *arg) 
{ 
    int n1,n2,sum; 
    n1=global[0]; 
    n2=global[1]; 
    sum = n1+n2; 

    printf("N1 + N2 = %d\n",sum); 

    return NULL; 
} 
+0

好的,這很有道理,謝謝!關於這個愚蠢的部分,我知道,但我只是學習如何在線程之間傳遞參數,從而反正使用它。 –