多线程 - c中矩阵乘法中的偶然段错误

时间:2017-01-28 06:15:32

标签: c multithreading

我正在开发一个小型多线程矩阵乘法程序。我的第一个工作是用随机整数填充矩阵的条目。在我尝试将函数指针传递给pthread_create后,我遇到了一些段错误。我认为问题在于函数pthread_join

但总的来说有两个问题。

第一个是每次都不会发生段故障。有时代码有效,但大多数情况下它都没有。所以这让我很困惑。

另一个是当代码工作时,总有几个条目仍未初始化,特别是对于矩阵[0] [0],它永远不会被初始化。而且我不太清楚在哪个地方调试那个。

这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#include <unistd.h>
#include <pthread.h>

#define N       5
#define MAX     10

int A[N][N];
int B[N][N];
int C[N][N];
pthread_t pid[N][N];

typedef struct {
    int row, col;
} Pos;

typedef void* (*thread_func)(void*);

void print_matrix(int M[][N]) {
    int i, j;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            printf("%3d", M[i][j]);
            if (j < N - 1) {
                printf(", ");
            }
        }
        printf("\n");
    }
}

void join_threads(void) {
    int i, j;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            pthread_join(pid[i][j], NULL);
        }
    }
}

void* fill_entry(void* arg) {
    Pos* pos = (Pos*)arg;
    A[pos->row][pos->col] = rand() % MAX;
    B[pos->row][pos->col] = rand() % MAX;
    return NULL;
}

void dispatch_jobs(thread_func job_func) {
    int i, j;
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            Pos pos;
            pos.row = i;
            pos.col = j;
            if (pthread_create(&pid[i][j], NULL, job_func, (void*)&pos)) {
                perror("pthread_create");
                exit(-1);
            }
        }
    }
}

int main(void) {

    srand(time(NULL));

    dispatch_jobs(&fill_entry);
    join_threads();
    printf("Matrix A:\n");
    print_matrix(A);
    printf("Matrix B:\n");
    print_matrix(B);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

Pos pos;
pos.row = i;
pos.col = j;
if (pthread_create(&pid[i][j], NULL, job_func, (void*)&pos)) {
    perror("pthread_create");
    exit(-1);
}

您正在向线程传递指向局部变量的指针。一旦线程试图访问数据,即取消引用指针,变量就会消失,重用,并包含垃圾数据。