gpt4 book ai didi

c - 使用 Pthread 的动态矩阵乘法

转载 作者:行者123 更新时间:2023-11-30 17:25:31 27 4
gpt4 key购买 nike

我是线程编程和 C 语言的初学者,我正在尝试弄清楚如何使用 Pthreads 进行简单的矩阵乘法。我想为每一列创建一个线程并将结果放入结果矩阵中。我正在尝试动态地执行此操作,这意味着允许用户使用输入作为大小来创建两个 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(:= 结果) 以及代码中显示的内容。我只是收到错误“无效使用具有非特定边界的数组”,即使我在主方法中声明了所有三个。

我理解这里有什么问题吗或者我该如何解决这个问题?我尝试改编我的讲座的一个示例,其中将为每个元素创建一个线程。提前致谢!

最佳答案

关于错误:

 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;
}

但是您必须注意线程可以并发访问数据,因此如果不同的线程可以使用和更改相同的值,您应该使用一些锁。

关于c - 使用 Pthread 的动态矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27061571/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com