使用c

时间:2015-05-09 14:40:18

标签: c multithreading unix matrix

问题陈述是这样的:计算二维矩阵中元素的总和,使用单独的线程计算 每行的总和 < / 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;
    }

1 个答案:

答案 0 :(得分:0)

你需要

s[k] += a[k][i];

而不是

s[i] += a[k][i];

每个行的总和应在每个row的每个索引中相加,因为s被声明为s[M]