C中多线程程序的错误

时间:2013-02-19 00:32:47

标签: c multithreading matrix-multiplication

有人可以建议我为什么会出现以下错误,以及我的程序是否正确?我的程序中出现以下错误。我没有得到任何结果 输入文件是
2 3
1 2 3
3 4 5
3 4
3 5 6 7
1 3 4 8
2 3 5 6
我的节目是

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int m,p,q,n; Matrix A has dimensions m, n and B has dimensions p,q
int **a, ** b, **c;
void *mulrow(void* row);

void print(int** a,int _i, int _j) 
{
int i,j;
for (i = 0; i < _i; ++i) {
    for (j = 0; j < _j; ++j)
    printf("%d  ",a[i][j]);
    printf("\n");
    }
}

void writeMat(int** a,int _i, int _j, FILE* f)
{
    int i,j;
    for (i = 0; i < _i; ++i) {
        for (j = 0; j < _j; ++j)
            fprintf(f,"%d ",a[i][j]);
        fprintf(f,"\n");
    }
}

void matrix_multiply()
{
    // Every row of matrix is computed 
    int i,r;
    pthread_t** threads = (pthread_t**) malloc(sizeof(pthread_t*)*m);
    int* rows = (int*) malloc(sizeof(int)*m);

    for (i = 0; i < m; ++i) {
        threads[i] =(pthread_t*) malloc(sizeof(pthread_t));
        rows[i] = i;
        r = pthread_create(threads[i], NULL, mulrow, (void*) &rows[i]);
        if (r<0)
            printf("failed to create thread at mul2 at i =  %d\n",i);
    }

    for (i = 0; i < m; ++i)
        pthread_join(*threads[i],NULL);
    free(threads);
    free(rows);
}

void *mulrow(void* row)
{
    int j, i = *((int*)row) ,k;

    for (j = 0 ; j < n ; j ++)
        for (k = 0 ; k < p ; k++)
            c[i][j] += a[i][k] * b[k][j];
    pthread_exit(NULL);
}

int **read_matrix(FILE *f,int m, int n)
{
    int i,j;
    int **a = (int**) malloc(sizeof(int *)*m);
    for (i = 0; i < m; ++i) {
        a[i] = (int *) malloc(sizeof(int)*n);
        for (j = 0; j < n; ++j) {
        fscanf(f,"%d",&a[i][j]);
    }
    return a;
}

int main(void)  
{
    int i,j;
    FILE* in  = fopen("input.txt","r");
    fscanf(in,"%d %d",&m,&p);
    a = read_matrix(in,m,p);
    fscanf(in,"%d %d",&q,&n);
    b = read_matrix(in,q,n);
    if (p!=q){
        printf("incompatible matrices --not supported\n");
        return 0;
    }
    c = (int**) malloc(sizeof(int *)*m);
    for (i = 0; i < m; ++i){
        c[i] = (int *) malloc(sizeof(int)*n);
        for (j = 0; j < n; ++j)
            c[i][j] = 0;
    }
    printf("Result of multiplication \n");
    matrix_multiply();
    return 0;
}

2 个答案:

答案 0 :(得分:0)

在你的程序中,你需要注释掉一个语句。

int m,p,q,n; //Matrix A has dimensions m, n and B has dimensions p,q

最后一行有一个右大括号丢失,即return 0;

之后

通过此更改并与pthread库链接应编译您的程序。

gcc -o test_exe file.c -lpthread

我成功编译了你的代码。

答案 1 :(得分:0)

该行

int j, i = *((int*)row) ,k;

导致你的问题。 C不允许多个初始化器,并且在同一语句中的decalrartions之间不能进行赋值。在=的右侧,您使用的是逗号操作符,它执行左侧的语句,然后执行并返回右侧的结果。所以你要将j和i都设置为k(无论是什么)

我认为你想要的是:

void *mulrow(void* row)
{
    int i = *((int*)row);
    int j;
    int k;

    for (j = 0 ; j < n ; j ++)
        for (k = 0 ; k < p ; k++)
            c[i][j] += a[i][k] * b[k][j];
    pthread_exit(NULL);
}