在这个线程代码中生成的分段错误在哪里?

时间:2010-10-27 14:23:47

标签: c multithreading

在这个作业中,应该为每个象限使用不同的线程添加两个矩阵。这是我到目前为止的尝试,它产生了一个我无法识别的段错误。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define N 4  //matrix dimension

int c[4][4];


int a[4][4]={1 ,3, 4, 5, 3, 4, 5, 6,7, 8, 9, 0, 2, 10, 3, 5};//test matrices

int b[4][4]={3, 4, 5, 6, 11, 7, 9, 3, 1, 1, 4, 5,1, 0, 0, 6};



void *cuadrante(void *argv[1]){

    int t,i,j,k;

    int opcion;

    opcion = atoi(argv[1]);      //meant to cast the quadrant number 


    switch (opcion){

    case 1:
        k=((N/2)-1); //A11 position 

        for (i=k;i=0;i--){          //1st quadrant
                for (j=k;j=0;j--){

                    c[i][j]=a[i][j]+b[i][j];
                }
            }
    break;

    case 2:

        k=((N/2)-1); //next to A11

        for (i=k-1;i=0;i--){            //2nd quadrant
            for (j=k;j<N;j++){

                c[i][j]=a[i][j]+b[i][j];
                }
            }

    break;

    case 3:

        t=N/2; //

        for (i=t;i<N;i++){          //3rd quadrant
                for (j=(t-1);j=0;j--){

                    c[i][j]=a[i][j]+b[i][j];
                }
        }

    break;

    case 4:

        t=N/2;      //position A22 
        for (i=t;i<N;i++){          //4th quadrant
                for (j=t;j<N;j++){

                c[i][j]=a[i][j]+b[i][j];
                 }
            }

    break;


    default: 
        printf("\n Opcion erronea. Intente de nuevo");

    }//fsw




}//end cuadrante






int main(int argc,char * argv[])
{
    int rc, t;

    pthread_t threads[4];

    for(t=0;t<4;t++){

        rc = pthread_create(&threads[t], NULL, cuadrante, (void *)argv[1]);
          if (rc){
             printf("ERROR; return code from pthread_create() is %d\n",rc);
             return -1;
          }//end if

        }//end for

   printf("Created %d threads.\n", t);
   pthread_exit(NULL);
   return 0;


}//end main

2 个答案:

答案 0 :(得分:0)

您将argv[1]作为参数传递给所有4个线程;所以他们最终都不会通过switch语句采用相同的路径吗?

此外,您的函数将其参数声明为void **,但您将char *强制转换为void *。这必然会引起问题。你可能想要这个:

void *cuadrante(void *arg){

    int t,i,j,k;

    int opcion;

    opcion = atoi((char *)arg);      //meant to cast the quadrant number 

    ...

答案 1 :(得分:0)

如果所有其他方法都失败,请使用printf填充代码。你会在15分钟内找到问题。