0

CalcTerm 関数は、特に m1->d[n][m] などにアクセスしようとしているときに問題が発生する場所です。

シングル コアの WINDOWS プラットフォームで実行した場合、同じコードが動作しました (または、少なくとも動作したように見えました)。しかし、Unix Lab で試してみるとすぐに、セグメンテーション違反が発生しました。

#include <iostream>
#include <cstdlib>
#include <pthread.h>
using std::cout;
using std::endl;
#define SIZE 3

//*******************STRUCTS AND GLOBAL VARIABLES*****************************//

struct Matrix
{
       int d[SIZE][SIZE];
       };


Matrix* matrix_addr[SIZE]; // array to store the address of the matrices

int n;
int m;

pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t my_cond = PTHREAD_COND_INITIALIZER;



//****************************PRINT FUNCTIONS*********************************//

void print(Matrix* m)
{
     ...
}

//............................................................................//

void print_result(Matrix* m0, Matrix* m1, Matrix* m2)
{
     ...
}



//****************************THREAD******************************************//

void* calcTerm(void* arg)
{
    int sum = 0;

    int* matptr = (int*) arg; 
    void* mat0 = (void*)(*((Matrix*)matptr)).d[0][0];

    matptr = (int*) arg+1;
    void* mat1 = (void*)(*((Matrix*)matptr)).d[0][0];

    matptr = (int*) arg+2;
        void* mat2 = (void*)(*((Matrix*)matptr)).d[0][0];

    Matrix* m0 = (Matrix*) mat0;
    Matrix* m1 = (Matrix*) mat1;
    Matrix* m2 = (Matrix*) mat2;

    cout << endl << "Inside thread\n" ;

    pthread_mutex_lock(&my_mutex);

    for (int i = 0; i < SIZE; ++i)
    {
        cout << "\ni = " << i << "\tn = " << n << "\tm = " << m << endl;
        sum =  sum + m1->d[n][i] * m2->d[i][m];
    } 

    m0->d[n][m] = sum;

    // update n and m for the next thread


          if (m < 2) 
             m++;
          else
             m = 0;
          if (n < 2) 
             n++;
          else
             n = 0;


     //pthread_cond_signal(&my_cond);
     pthread_mutex_unlock(&my_mutex);
     cout << endl << "Going out of thread\n" ;
     pthread_exit(NULL);
}



//********************************MAIN****************************************//

int main()

{
    Matrix m0, m1, m2; //Matrices are 3x3; 
                       // m0 <= m1 * m2
    pthread_t id[9];   // 3x3 matrix multiplication requires 9 threads.

    matrix_addr[0] = &m0;     // the pointers to the matrices are stored here.
    matrix_addr[1] = &m1;
    matrix_addr[2] = &m2;


    n = m = 0;       // initialize the global variable
    srand(time(NULL));  // seed rand()




    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            m0.d[i][j] = 0;           // m0 is being cleared for the output
            m1.d[i][j] = rand()%10;    // m1 and m2 are generated with rand()
            m2.d[i][j] = rand()%10;

        }
    }
    //display the input matrices
    cout << "MATRIX 1:\n\n";
    print (&m1);
    cout << "\nMATRIX 2:\n\n";
    print (&m2);
    cout << "\nMATRIX 3:\n\n";
    print (&m0);



    for (int i = 0; i < SIZE*SIZE; i++) // run all the threads for calculating each output
    {

    cout << endl << "Going in to thread " << i ;
        pthread_create(&id[i], NULL, calcTerm, (void*) &matrix_addr);

    cout << endl << "Out of thread " << i ;
    //pthread_join(id[i], NULL);
        }    
    //pthread_cond_wait(&my_cond, &my_mutex);

    print_result (&m0, &m1, &m2);
    return 0;



}

ところで、私はまだ pthread_join() を使用していません。なぜなら、それをどのように使用する必要があるのか​​ わからないからです。できる限り多くの提案を歓迎します。

ああ、pthread_cond_stuff; もコメントアウトしました。できれば使わないほうがいいです。

ありがとう。

4

0 に答える 0