2014-11-21 169 views
0

我是一名初學者,主要使用線程編程和C,我試圖找出如何使用Pthreads進行簡單的矩陣乘法。我想爲每列創建一個線程,並將結果放入結果矩陣中。我試圖動態地做到這一點,這意味着用戶可以使用輸入作爲大小來創建兩個n×n矩陣。使用Pthreads進行動態矩陣乘法

我的代碼,現在,不包括填充所述矩陣和讀取大小n爲執行以下操作:

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

typedef struct Matrix { 
int line, col, size; 
double (*MA)[]; 
double (*MB)[]; 
double (*MC)[]; 
} Matrix; 


void *multiply(void *arg) { 
Matrix* work = (Matrix*) arg; 
int s, z; 
s = work->col; 
z = work->line; 
work->MC[0][0] = 0.0.//can't use MC, MB, MA here!! 
return 0; 
} 

int main() { 
Matrix* m; 
//read size and set it to int size (miissing here, does work) 

double MA[size][size], MB[size][size], MC[size][size]; 
int i, j; 
//filling the matrices (missing here, does work) 

pthread_t threads[size]; 

for (i = 0; i < size; i++) { 
    m = malloc(sizeof(Matrix*)); 
    m->size = size; 
    m->col = i; 
    pthread_create(&threads[i], NULL, multiply, m); 

} 

for (i = 0; i < size; i++) { 
    pthread_join(threads[i], NULL); 
} 
return 0; 

} 

的問題是,我不能使用既不MA,MB,也不NC(:=結果)在乘法與代碼中顯示的一樣。 即使我在主要方法中聲明瞭所有這三個元素,我也只是得到錯誤「數組的非特定邊界無效使用」。

我瞭解這裏有什麼不對嗎,或者我該如何解決這個問題?我試圖修改我講座的一個例子,在那裏爲每個元素創建一個線程。 在此先感謝!

+0

如果你曾經分配過它,你如何使用MC進行乘法運算? – 2014-11-21 13:02:29

+0

你是什麼意思?問題是我不能在繁殖中使用它。 – rehne93 2014-11-21 13:03:51

回答

0

就有關該錯誤:

work->MC[0][0] = 0.0.//can't use MC, MB, MA here!! 

MC被宣佈爲double (*MC)[],並嘗試使用它作爲一個二維數組像你已經宣佈它double MC[N]{M]。您可以使用兩個(或更多)維數組,如果且僅當第一維是固定的,或者如果您逐行分配它。

所以,你的程序可能是:

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

typedef struct Matrix { 
    int line, col, size; 
    double MA[][]; 
    double MB[][]; 
    double MC[][]; 
} Matrix; 

void *multiply(void *arg) { 
    Matrix* work = (Matrix*) arg; 
    int s, z; 
    s = work->col; 
    z = work->line; 
    work->MC[0][0] = 0.0 
    return 0; 
} 

int main() { 
    Matrix* m; 
    //read size and set it to int size (miissing here, does work) 

    double MA[][], MB[][], MC[][]; 
    int i, j; 
    pthread_t threads[size]; 

    MA = (double **) malloc(size * sizeof(double *)); 
    MB = (double **) malloc(size * sizeof(double *)); 
    MC = (double **) malloc(size * sizeof(double *)); 
    for(int i=0;i<size;++i){ 
     MA[i] = (double *) malloc(size * sizeof(double)); 
     MB[i] = (double *) malloc(size * sizeof(double)); 
     MC[i] = (double *) malloc(size * sizeof(double)); 
    } 

    for (i = 0; i < size; i++) { 
     m = malloc(sizeof(Matrix*)); 
     m->MA = MA; 
     m->MB = MB; 
     m->MC = MC; 
     m->size = size; 
     m->col = i; 
     pthread_create(&threads[i], NULL, multiply, m); 
    } 

    for (i = 0; i < size; i++) { 
     pthread_join(threads[i], NULL); 
    } 
    return 0; 
} 

但你必須要小心的是,線程可以訪問到的數據同時,所以你應該使用一些鎖,如果不同的線程可以使用和更改相同的值。

+0

好的,謝謝,但我不能在結構中定義它的二維,因爲我不知道它們的大小。有沒有解決方法? – rehne93 2014-11-21 13:08:39

+0

我看到問題出在哪裏,但是例如什麼是「s」。 「S->大小」? – rehne93 2014-11-21 13:24:24

+0

@ rehne93沒有什麼......只是一個TYPO – 2014-11-21 13:26:41