在 pthread 编程中,我仍然不太确定。如果有人能告诉我一个绝对的答案,我将不胜感激。
我之前的问题在这里: 如何在简单的 Pthread 编程中分配数组变量?
现在,我正在研究矩阵乘法。使用它效果很好:
typedef struct {
int rowIdx;
int (*matA)[SIZE], (*matB)[SIZE], (*matC)[SIZE];
} newType;
int main (){
int matriksA[SIZE][SIZE];
int matriksB[SIZE][SIZE];
int matriksC[SIZE][SIZE];
for (i=0;i<NUM_THREAD;i++) {
(*block).rowIdx = i;
(*block).matA = matriksA;
(*block).matB = matriksB;
(*block).matC = matriksC;
pthread_create(&arrThread[i], NULL, matrixMul, (void *)block);
block++;
}
}
void *matrixMul(void *x){
newType *p = (newType *) x;
int i = (*p).rowIdx;
int j,k;
for (j=0;j<SIZE;j++){
int result = 0;
for(k=0;k<SIZE;k++){
int MAik = (*p).matA[i][k];
int MBkj = (*p).matB[k][j];
result = result + (MAik*MBkj);
}
(*p).matC[i][j] = result;
}
pthread_exit(NULL);
}
matrixMul 正在执行矩阵乘法 matC = matA x matB。
我之前尝试过使用这个结构,但它没有用。
typedef struct {
int rowIdx;
int **matA, **matB, **matC;
} newType;
显然,从我读过的内容来看,变量数组可以被认为是一个指针,它保存着数组中第一个元素的地址。至于二维数组,我们必须告诉编译器列的大小。因此,我们必须在 typedef 结构中使用 (*matA)[SIZE] 而不是 **matA。
但我仍然不确定我在那里做什么。我只是通过分配指针将二维数组复制到另一个二维数组还是什么?有点混乱……哈哈……
我的下一个问题是关于这些行:
(*block).matA = matriksA;
(*block).matB = matriksB;
(*block).matC = matriksC;
那里究竟发生了什么?上面代码中的每个块变量是否都有自己的矩阵数据副本?或者他们只是通过让他们的指针指向内存中的相同位置来共享它,这意味着 matA、matB 和 matC 的行为就像一个静态变量(如在面向对象编程中)?也就是说,matA、matB、matC是否只有一份?线程是否同时访问共享数据?或者是否有许多“matA”副本,并且每个副本在 RAM 中都有自己不同的分配?
我的第一篇文章也有同样的问题,这些线后面发生了什么?(*z).arrA = arrayA; (*z).arrB = arrayB; (*z).arrC = 数组C;
上面的代码是否足够有效地完成任务(数组加法和矩阵乘法)?或者从内存分配的角度来看,还有另一种更有效的方法吗?
@Code-Guru:我已经发布了新问题。