使用多线程的矩阵乘法中的分段错误

时间:2016-09-16 12:54:13

标签: c multithreading matrix pthreads

#include <stdio.h>
#include <pthread.h>
int arr[1000][1000];
int brr[1000][1000];
int h;
int f;
void *BMM(void *arg)
{
    int* neo = (int*) arg;
    int ne = *neo;
    int sum = 0;
    for(int i = 0; i < n; ++i)
    {
        sum += arr[x][i]*brr[x][f];
        ++f;
    }
    printf("%d\n", sum);
    crr[x][h] = sum;
    pthread_exit(NULL);
    }
int main()
{
    pthread_t* ar = malloc(3*sizeof(*ar));
    printf("Enter the value of m and n\n");
    scanf("%d %d",&m,&n);
    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    printf("Enter the value of p and q\n");
    scanf("%d %d",&p,&q);
    if(p != n)
    {
        printf("The matrix multiplication is not possible\n");
        return 0;
    }
    int* id;
    id = (int *)malloc(4*sizeof(int));
    for(int i = 0; i < p; ++i)
    {
        for(int j = 0; j < q; ++j)
        {
            scanf("%d",&brr[i][j]);
        }
    } 
    for(x = 0; x < m; ++x)
    {
        for(z = 0; z < q; z+=4)
        {
            f = z;
            h = z;
            for(int k = 0; k < 3; ++k)
            {
                pthread_create(&ar[k],NULL,BMM,NULL);   
            }
            for(int k = 0; k < 3; ++k)
            {
                pthread_join(ar[k],NULL);
            } 
        }
    }
    for (int i = 0; i < m; ++i)
    {
        for(int j = 0; j < q; ++j)
        {
            printf("%d ",crr[i][j]);
        }
        printf("\n");
    }
}

上述程序应该通过将矩阵的第一行乘以3个线程的其他矩阵的所有列乘以两个矩阵,然后将所有其他列的第二行相乘,依此类推,然后将相应的值存储在另一个矩阵中但是它给出了分段错误。我哪里错了?

1 个答案:

答案 0 :(得分:2)

我认为你的问题在这里:

pthread_create(&ar[k],NULL,BMM,NULL);   
                               ^^^^
                            void *arg is NULL

然后:

void *BMM(void *arg)
{
    int* neo = (int*) arg;
    int ne = *neo;             // Dereference NULL --> segmentation fault

此外这看起来很奇怪:

void *BMM(void *arg)
{
    int* neo = (int*) arg;
    int ne = *neo;           // ne is never used !! 
    int sum = 0;
    for(int i = 0; i < n; ++i)  // Where does n come from ?

也许它应该是n而不是ne

如果nxfh是全局变量,则会遇到麻烦,因为所有线程都会对相同的变量起作用。那将是非常糟糕的。每个线程都需要它自己的变量。

  

BTW:

始终检查scanf返回的值 - 例如:

if (scanf("%d %d",&m,&n) != 2)
{
    // Add error handling here
}

if (scanf("%d",&arr[i][j]) != 1)
{
    // Add error handling here
}