操作系統實驗六之多線程矩陣乘法

一、實驗內容

實現多線程矩陣乘法:
這裏寫圖片描述

二、實驗代碼

#include <stdio.h>
#include <pthread.h>

#define DIMENSION 10

pthread_t hThread[DIMENSION][DIMENSION];

int J, K, M, N;
int mat1[DIMENSION][DIMENSION];
int mat2[DIMENSION][DIMENSION];
int result[DIMENSION][DIMENSION];

struct Data{
    int row;
    int col;
};

void *ThreadProc(void *data){
    struct Data *tmp = (struct Data *)data;
    int rs = 0;

    int loop;
    for(loop = 0; loop < K; loop++){
        rs += mat1[tmp->row][loop]*mat2[loop][tmp->col];
    }
    result[tmp->row][tmp->col] = rs;
}

int main(){
    int i, j;
    struct Data data[DIMENSION][DIMENSION];
    int ret;

    printf("輸入矩陣行數和列數:");
    scanf("%d%d", &J, &K);  
    printf("輸入矩陣:");
    for(i = 0; i < J; i++){
        for(j = 0; j < K; j++){
            scanf("%d", &mat1[i][j]);
        }
    }

    printf("輸入矩陣行數和列數:");
    scanf("%d%d", &M, &N);
    printf("輸入矩陣:");
    for(i = 0; i < M; i++){
        for(j = 0; j < N; j++){
            scanf("%d", &mat2[i][j]);
        }
    }
    if( K != M || J > 10 || K > 10 || M > 10 || N > 10){
        printf("Your input produrce an error\n");
        return -1;
    }

    for(i = 0; i < J; i++){
        for(j = 0; j < N; j++){
            data[i][j].row = i;
            data[i][j].col = j;

            ret = pthread_create(&hThread[i][j], NULL, ThreadProc, (void*)&data[i][j]);
            if(ret != 0){
                printf("Create thread error!\n");
                return -1;
            }
        }
    }

    for(i = 0; i < J; i++){
        for(j = 0; j < N; j++){
            pthread_join(hThread[i][j], NULL);
        }
    }

    printf("\n運算結果:\n");
    for(i = 0; i < J; i++){
        for(j = 0; j < N; j++){
            printf("%-5d ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

三、實驗結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章