2017-03-09 8 views
-1

LinuxでCで行列乗算を行い、特にpthreadを使用しています。ここに私のコードです。それは実行に失敗し、空の行列を1回だけ印刷し、セグメンテーション・エラーを示しました。誰かが間違いを指摘できますか?ありがとうございました。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スレッドが同じデータを同時に操作するので、競合状態をどうやって防ぐのですか? 2つのアレイを9回掛け合わせていないことをどうやって確認していますか? –

+1

なぜ同じことをして同じ変数を書く 'multiply()'の9つのスレッドを実行していますか? – alvits

答えて

0

同じグローバル変数にアクセスしている同時に9つのスレッドをすべて実行しています。これは問題を引き起こす可能性があります。スレッドを呼び出した直後に少し時間をかけてみてください。 sleep(1);はそのトリックを行うことができます。または、mutex/semaphoreのようなメカニズムを使用してください。