2017-03-09 150 views
-1

我正在C語言中進行矩陣乘法,特別是使用pthread。這是我的代碼。它運行失敗,它只打印一次空矩陣並表示分段錯誤。任何人都可以指出錯誤嗎?謝謝。C中的多線程矩陣乘法

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

#define NUM_THREADS 9 
int A[3][3] = {{2,5,6},{2,12,10},{6,1,8}}; 
int B[3][3] = {{7,5,1},{17,0,13},{3,2,5}}; 
int answer[3][3]={0}; 

void *multiply (void *param); 
void print_matrix (int m[3][3]); 

void print_matrix (int m[3][3]) { 
    int i, j; 
    for (i = 0; i < 3; i++) { 

      for (j = 0; j < 3; j++) 
      printf("%d\t ", m[i][j]); 
    printf("\n"); 
    } 
} 

void *multiply (void *param) { 
    int i, j, k; 
    for(i = 0; i < 3; i++) 
    { 
      for(j = 0; j < 3; j++) 
      { 
        for(k = 0; k < 3; k++) 
        { 
          answer[i][j] += A[i][k] * B[k][j]; 
        } 
      } 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    pthread_t tid[NUM_THREADS]; 
    int i, j; 
    for (i = 0; i < NUM_THREADS; i++) { 
     pthread_attr_t attr; /* set of attributes for the thread */ 
     pthread_attr_init(&attr);/* get the default attributes */ 
     pthread_create(&tid[i],&attr,multiply,NULL); 
    } 

    for (j = 0; j < NUM_THREADS; j++) { 
     pthread_join(tid[i],NULL); 
     print_matrix(answer); 
    } 


} 
+2

你是否自己做過任何調試?使用調試器和/或調試打印語句。你發現了什麼? – kaylum

+0

你如何將你的數據傳遞給你的線程?由於9個線程同時處理相同的數據,您如何防止競爭條件?你如何確保你不會將這兩個陣列乘以9次? –

+1

你爲什麼運行'multiply()'的9個線程做同樣的事情並寫在同一個變量上? – alvits

回答

0

您正在同時運行全部9個線程,這些線程正在訪問相同的全局變量。這可能會造成問題。嘗試在調用線程後施加一個小的時間延遲。 sleep(1);可以做到這一點。或者使用像互斥/信號量這樣的機制