2015-01-08 350 views
0

我是那種在線程編程新手,我正在開發一個小運動,這裏是鍛鍊文本:全局變量

寫的Pthreads使用一個C程序實現兩個矩陣的乘積。 主線程創建nr1 * nc2線程,每個線程執行其計算。 最後主線程打印產品矩陣。

這是我的計劃,寫了用C語言

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

#define N 3 

typedef struct { 
    int rm1; 
    int cm2; 
} tipe_rc; 

int matr1[N][N], matr2[N][N], result[N][N]; 

void * multiply_matrix(void *arg); 

int main(int argc, const char * argv[]) { 
    int matr1[N][N], matr2[N][N], i, j, k=0; 
    pthread_t matr_pthread[N][N]; 
    void* retval; 
    tipe_rc *trc; 

    // fill the two matrix 
    for (i=0; i<N; i++) { 
     for (j=0; j<N; j++) { 
      matr1[i][j] = k++; 
     } 
    } 

    for (i=0; i<N; i++) { 
     for (j=0; j<N; j++) { 
      matr2[i][j] = k++; 
     } 
    } 

    // start the thread computation 
    for (i=0; i<N; i++) { 
     for (j=0; j<N; j++) { 
      trc = malloc(sizeof(tipe_rc)); 
      trc->rm1 = i; 
      trc->cm2 = j; 
      pthread_create(&matr_pthread[i][j], NULL, multiply_matrix, (void*) trc); 
     } 
    } 

    // rejoin all the threads 
    for (i=0; i<N; i++) { 
     for (j=0; j<N; j++) { 
      pthread_join(matr_pthread[i][j], &retval); 
     } 
    } 

    // print result matrix 
    for (i=0; i<N; i++) { 
     for (j=0; j<N; j++) { 
      printf("%d ", result[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 


void * multiply_matrix(void *arg) { 
    int i=0; 
    tipe_rc *trc = (tipe_rc*) arg; 
    result[trc->rm1][trc->cm2] = 0; 
    for (i=0; i<N; i++) { 
     result[trc->rm1][trc->cm2] += matr1[trc->rm1][i] * matr2[i][trc->cm2]; 
    } 
    return NULL; 
} 

代碼似乎很容易和漂亮的直線前進,但不知何故,我設法遇到一些問題,這兩個矩陣。

的問題

基本上,當我嘗試利用矩陣matr1和線程matr2,似乎矩陣是空的(所有的值爲零),同時儘快因爲在main()中生成了兩個矩陣,他們得到了正確的值。

這是爲什麼? 根據進程和生成的線程之間的共享內存空間,我做錯了什麼?

回答

2

您有兩個,每個matr1matr2變量。在全局級別設置一個,並且在main函數內部設置一個局部區域,然後影響全局變量。

由於線程使用全局變量,它們將全部爲零(因爲全局變量爲零初始化)。

簡單的解決方案是不重新聲明main函數中的變量。

+0

天哪,非常感謝,我完全陷入了這一段時間,沒有注意到重新宣佈。 – Ivano