我有两个matrix只包含一个,每个数组有500行和列 。 所以,得到的matrix应该是所有元素的值为500的matrix。 但是,我越来越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; }
我不知道这是否是你的问题的原因,但是:
pthread_create(&p[j],NULL,mult_thread,&j);
肯定是坏了。 你正在通过j &j
的地址。 所以每个线程在实际启动时都会得到一个随机值0 <= starting_row <= 9。 (void*)j
可能更好,然后用(int)j
来取出。
你也永远不会初始化res_mat
,但IIRC它会被初始化。
编辑:start_row的值是随机的原因是j
经过所有在0和9之间的线程正在启动的线程,它正在加入。 所以线程将在这两者之间的某个随机点开始,并且会在这个点上提取j
的值。
您将一个指针传递给j的线程函数。 当线程访问它时,j的值可能已经改变。 只要传递(void *)j并将线程函数中的转换更改为starting_row = (int)t;
。