gpt4 book ai didi

c - 我使用 pthread 创建了一个矩阵乘法程序但是 [0][0] block 值总是 0

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:28 24 4
gpt4 key购买 nike

这是我的代码。

#include <stdio.h>
#include <pthread.h>
int a[3][3],b[3][3],c[3][3];
struct Storage {
int i,j;
};
void* matThreadMul(void *storage) {
struct Storage *tempStorage = storage;
int m;
int i=tempStorage->i;
int j=tempStorage->j;
printf("value of i,j : %d,%d\n", i, j);
c[i][j]=0;
for(m=1;m<=3;m++){
c[i][j]=c[i][j]+(a[i][m]*b[m][j]);
}
printf("value of c[%d][%d] : %d\n", i,j, c[i][j]);
}
int main()
{
int i,j;
struct Storage storage;
pthread_t thread[3];
for(i=1; i<=3; i++){
for(j=1;j<=3;j++){
printf("Enter a[%d][%d] : ", i,j);
scanf("%d", &a[i][j]);
}
}
for(i=1; i<=3; i++){
for(j=1;j<=3;j++){
printf("Enter b[%d][%d] : ", i,j);
scanf("%d", &b[i][j]);
}
}
printf("****after multiplication****\n");
for(i=1;i<=3;i++){
storage.i=i;
for(j=1;j<=3;j++){
storage.j=j;
pthread_create(&thread[j], NULL, matThreadMul, &storage);
}
}
for(i=1;i<=3;i++){
pthread_join(thread[i], NULL);
}
for(i=1; i<=3; i++){
for(j=1;j<=3;j++){
printf("%d ", c[i][j]);
}
printf("\n");
}
return 0;
}

并且还建议我如何为 matThreadMul 传递 2 个参数在 pthread_create() 中发挥作用方法。

我输入了 2 个矩阵。

a= 1 2 3
4 5 6
7 8 9
b= 1 0 0
0 1 0
0 0 1

a*b = 0 2 3
4 5 6
7 8 9

我得到了 0而不是 1最后 a*b矩阵。

帮我解决这个问题。

谢谢。

最佳答案

首先要注意的是,在 C 语言中,数组从 0 开始。所以当您有一个数组 a[0] 时,它的索引为 0,1,2。

因此您的数组 int a[3][3],b[3][3],c[3][3]; 的索引从 0 开始。但是您使用的索引是1,2,3。您应该更改索引或以更简单的方式为每个数组分配一个额外的元素。

int a[4][4],b[4][4],c[4][4];

您的代码还有 2 个其他问题。

  1. 您正在使用嵌套 for 循环创建 9 个线程,但在连接期间您只连接了 3 个。最好的方法是拥有一个二维线程数组,并在创建和连接中使用它。

  2. storage 结构在所有九个线程中重复使用。这是不正确的,因为线程将并发运行,并且您可能会在为线程读取结构之前更改结构。您应该再次为该结构使用二维数组。

工作代码如下。

#include <stdio.h>
#include <pthread.h>
int a[3][3],b[3][3],c[3][3];
struct Storage {
int i,j;
};
void* matThreadMul(void *storage) {
struct Storage *tempStorage = storage;
int m;
int i= tempStorage->i;
int j= tempStorage->j;
printf("value of i,j : %d,%d\n", i, j);
c[i][j]=0;
for(m=0;m<3;m++){
c[i][j]=c[i][j]+(a[i][m]*b[m][j]);
}
printf("value of c[%d][%d] : %d\n", i,j, c[i][j]);
}
int main()
{
int i,j;
struct Storage storage[3][3];
pthread_t thread[4][4];

for(i=0; i<3; i++){
for(j=0;j<3;j++){
printf("Enter a[%d][%d] : ", i,j);
scanf("%d", &a[i][j]);
}
}

for(i=0; i<3; i++){
for(j=0;j<3;j++){
printf("Enter b[%d][%d] : ", i,j);
scanf("%d", &b[i][j]);
}
}

printf("****after multiplication****\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
storage[i][j].i=i;
storage[i][j].j=j;
pthread_create(&thread[i][j], NULL, matThreadMul, &storage[i][j]);
}
}
for(i=0;i<3;i++)
for(j=0; j<3; j++)
{
pthread_join(thread[i][j], NULL);
}
for(i=0; i<3; i++){
for(j=0;j<3;j++){
printf("%d ", c[i][j]);
}
printf("\n");
}
return 0;
}

关于c - 我使用 pthread 创建了一个矩阵乘法程序但是 [0][0] block 值总是 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39761595/

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