我是线程编程和C的初学者,我试图弄清楚如何使用Pthreads进行简单的矩阵乘法。我想为每个列创建一个线程,并将结果放在Result Matrix中。我试图动态地进行,这意味着允许用户使用输入作为大小来创建两个n x n矩阵。
我的代码现在,不包括填充矩阵和读取大小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(:=结果),而是在代码中显示它。 我只是得到错误&#34;无效使用具有非特定边界的数组&#34;即使我在主要方法中声明了所有这三个。
我是否理解此处有任何错误或我该如何解决?我试图改编我演讲的一个例子,其中将创建每个元素的线程。 提前致谢!
答案 0 :(得分: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;
}
但是你必须注意线程可以同时访问数据,因此如果不同的线程可以使用和更改相同的值,你应该使用一些锁。