2010-03-15 2 views
4

У меня есть две матрицы, содержащие только единицы, и каждый массив имеет 500 строк и столбцов. Таким образом, результирующая матрица должна быть матрицей всех элементов, имеющих значение . Но, я получаю res_mat [0] [0] = 5000. Даже другие элементы также 5000. Почему?Использование pthread для выполнения умножения матрицы

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

#define ROWS 500 
#define COLUMNS 500 
#define N_THREADS 10 

int mat1[ROWS][COLUMNS],mat2[ROWS][COLUMNS],res_mat[ROWS][COLUMNS]; 

void *mult_thread(void *t) 
{ 
    /*This function calculates 50 ROWS of the matrix*/ 

    int starting_row; 
    starting_row = *((int *)t); 
    starting_row = 50 * starting_row; 

    int i,j,k; 
    for (i = starting_row;i<starting_row+50;i++) 
     for (j=0;j<COLUMNS;j++) 
      for (k=0;k<ROWS;k++) 
       res_mat[i][j] += (mat1[i][k] * mat2[k][j]); 
    return; 
} 

void fill_matrix(int mat[ROWS][COLUMNS]) 
{ 
    int i,j; 
    for(i=0;i<ROWS;i++) 
     for(j=0;j<COLUMNS;j++) 
      mat[i][j] = 1; 
} 

int main() 
{ 
    int n_threads = 10; //10 threads created bcos we have 500 rows and one thread calculates 50 rows 
    int j=0; 
    pthread_t p[n_threads]; 

    fill_matrix(mat1); 
    fill_matrix(mat2); 
    for (j=0;j<10;j++) 
     pthread_create(&p[j],NULL,mult_thread,&j); 

    for (j=0;j<10;j++) 
     pthread_join(p[j],NULL); 

    printf("%d\n",res_mat[0][0]); 
    return 0; 
} 
+0

В принципе, в моей программе каждый поток вычисляет 50 строк. И передаю значение строк для вычисления при выполнении вызова функции pthread_create() –

ответ

4

Я не знаю, если это является причиной вашей проблемы, но:

pthread_create(&p[j],NULL,mult_thread,&j); 

определенно сломана. Вы переходите по адресу j &j. Поэтому каждый поток получает случайное значение 0 < = start_row < = 9, когда он действительно начинается. Вероятно, лучше просто пройти в (void*)j и получить его с (int)j.

Вы также никогда не инициализируете res_mat, но IIRC он все равно будет инициализирован.

РЕДАКТИРОВАТЬ: Причиной, по которой значение starting_row является случайным, является j проходит через все цифры от 0 до 9 между нитью быть запущены, и она соединена. Таким образом, поток будет запущен в некоторой случайной точке между этими двумя, и в этот момент он получит значение j.

+0

Почему в каждом потоке значение start_row было бы случайным между 0 и 9? –

+0

Actaully, что я думаю, что ВСЕ РЕЗЬБЫ будут иметь такое же значение j .. Правильно ли я? –

+1

Нет, потому что, как только поток создается, вы не знаете, когда и в каком порядке они будут выполнены. После вызова pthread_create, какой поток выполняется, основной или только что созданный? поэтому вы можете быть правы (т. е. создаются все потоки, а затем приступать к выполнению), но это просто возможность – shodanex

3

Вы передаете указатель на j функции потока. Значение j может измениться, когда поток обращается к нему. Просто передайте (void *) j и измените листинг в функции потока на starting_row = (int)t;.

+0

Итак, что я на самом деле делаю? Только изменение & j -> (void *) j создаст ошибки SEG. –

+0

См. Обновленный ответ. – Henrik

+0

Thanx. Я понял. Легко и коротко .. Приветствия! –