【问题标题】:Dynamic Matrix Multiplication with Pthreads使用 Pthread 进行动态矩阵乘法
【发布时间】:2014-11-21 12:37:19
【问题描述】:

我一般是线程编程和 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(:= 结果),就像代码中显示的那样。 即使我在 main 方法中声明了所有这三个,我也只是收到错误“无效使用具有不确定边界的数组”。

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

【问题讨论】:

  • 如果你曾经分配过 MC,你如何在乘法中使用它?
  • 你到底是什么意思?问题是我不能多次使用它。

标签: c pthreads


【解决方案1】:

关于错误:

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

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

【讨论】:

  • 好的,谢谢,但我不能在结构中定义它是二维的,因为我不知道它们的大小。有什么解决方法吗?
  • 我知道问题出在哪里,但是例如“s”是什么? “s->大小”?
  • @rehne93 没什么...只是一个错字
  • @rehne93 现在应该没问题了
  • 行得通,谢谢。但是我仍然不能在乘法方法中使用它们..,如果我尝试写入/打印一个值,仍然会出现同样的错误。
猜你喜欢
  • 2013-01-30
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多