问题陈述是这样的:计算二维矩阵中元素的总和,使用单独的线程计算 每行的总和 < / strong>即可。主线程将这些总和相加,打印出最终结果。
从我到目前为止看到的,代码运行正常。唯一的问题是当我选择行数小而不是列数(例如rows = 2,columns = 3)时,因为它只计算前2列的总和,完全是无视第三个。
这是我在C中写的代码,我真的很感激任何帮助,了解我做错了什么或错过了什么。谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define M 10
#define N 10
int rows, columns, a[M][N], s[M];
// compute the sum of each row
void* f(void* p) {
int k = *((int*) p);
int i;
for (i = 0; i < columns; i++) {
s[i] += a[k][i];
}
return NULL;
}
int main() {
int i, j, *p, rc;
int sum = 0;
pthread_t th[M];
// matrix creation
printf("no. of rows = ");
scanf("%d", &rows);
printf("no. of columns = ");
scanf("%d", &columns);
for (i = 0; i < rows; i++) {
for (j = 0; j < columns; j++) {
printf("a[%d][%d] = \n", i, j);
scanf("%d", &a[i][j]);
}
}
printf("\nThe matrix is: \n");
for(i=0; i < rows; i++) {
for(j=0; j < columns; j++)
printf("%d ", a[i][j]);
printf("\n");
}
// thread creation
for (i=0; i < rows; i++) {
p = malloc(sizeof(int));
*p = i;
rc = pthread_create(&th[i], NULL, f, p);
if (rc != 0) {
printf("Thread creation failed");
exit(-1);
}
}
for (i=0; i < rows; i++) {
pthread_join(th[i], NULL);
}
// compute the final sum
for (i=0; i < rows; i++) {
sum += s[i];
}
printf("The sum is = %d\n", sum);
return 0;
}
答案 0 :(得分:0)
你需要
s[k] += a[k][i];
而不是
s[i] += a[k][i];
每个行的总和应在每个row
的每个索引中相加,因为s
被声明为s[M]
。