我有两个矩阵只包含一个,每个数组都有 500行和列。因此,得到的矩阵应该是具有值 500 的所有元素的矩阵。但是,我得到 res_mat [0] [0] = 5000 。甚至其他元素也是5000. 为什么?
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#define ROWS 500
#define COLUMNS 500
#define N_THREADS 10
int mat1[ROWS][COLUMNS],mat2[ROWS][COLUMNS],res_mat[ROWS][COLUMNS];
void *mult_thread(void *t)
{
/*This function calculates 50 ROWS of the matrix*/
int starting_row;
starting_row = *((int *)t);
starting_row = 50 * starting_row;
int i,j,k;
for (i = starting_row;i<starting_row+50;i++)
for (j=0;j<COLUMNS;j++)
for (k=0;k<ROWS;k++)
res_mat[i][j] += (mat1[i][k] * mat2[k][j]);
return;
}
void fill_matrix(int mat[ROWS][COLUMNS])
{
int i,j;
for(i=0;i<ROWS;i++)
for(j=0;j<COLUMNS;j++)
mat[i][j] = 1;
}
int main()
{
int n_threads = 10; //10 threads created bcos we have 500 rows and one thread calculates 50 rows
int j=0;
pthread_t p[n_threads];
fill_matrix(mat1);
fill_matrix(mat2);
for (j=0;j<10;j++)
pthread_create(&p[j],NULL,mult_thread,&j);
for (j=0;j<10;j++)
pthread_join(p[j],NULL);
printf("%d\n",res_mat[0][0]);
return 0;
}
答案 0 :(得分:4)
我不知道这是否是您问题的原因,但是:
pthread_create(&p[j],NULL,mult_thread,&j);
肯定是坏了。您正在传递j &j
的地址。因此,当它实际开始时,每个线程将获得随机值0&lt; = starting_row&lt; = 9。可能最好只传递(void*)j
并使用(int)j
将其删除。
你也永远不会初始化res_mat
,但是IIRC它无论如何都会被初始化。
编辑:
starting_row
的值是随机的原因是j
遍历正在启动的线程和正在连接的线程之间0到9之间的所有数字。
因此,线程将在这两个线程之间的某个随机点启动,并在此时获取j
的值。
答案 1 :(得分:3)
您正在向线程函数传递指向j的指针。当线程访问j时,j的值可能已经改变。只需传递(void *)j并将线程函数中的强制转换更改为starting_row = (int)t;
。