2015-05-03 2 views
0

Мне нужно вычислить сумму элементов в двумерной матрице, используя отдельный поток для вычисления суммы каждой строки. Затем основной поток суммирует эти суммы, печатая конечный результат. Можете ли вы, ребята, понять, что случилось? (я все новые на вещи нитками)Резьба и сумма двумерной матрицы

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

void sumR(void* _a,int m,int n,int sum) 
{ 
     int i; 
     int (*a)[m]=_a; 
     for(i=1;i<=n;i++) 
       sum+=a[n][i]; 
} 
int main() 
{ 
     int a[20][20],sum1,sum; 
     int m=3,n=3,k=3,i,j; 
     for(i=1;i<=m;i++) 
     { 
       k=k+3; 
       for(j=1;j<=n;j++) 
         a[i][j]=k; 
     } 
     sum1=0; 
     for(i=1;i<=m;i++) 
     { 
       sum=0; 
       pthread_t th; 
       pthread_create(&th,NULL,&sumR,&a,&m,&n,&sum); 
       sum1+=sum; 
       pthread_join(&th,NULL); 
     } 
     printf("Sum of the matrix is: %d",sum1); 
     return 0; 
} 

ответ

0

Одна проблема, которую я вижу, что ваш цикл делает в основном это:

for each row 
    start thread 
    add thread's sum to total 
    wait for thread to exit 

Это не будет работать, потому что вы добавляете потока суммировать до того, как поток выполнит его вычисление. Вам нужно подождать, пока заканчивается нить:

start thread 
wait for thread to exit 
add thread's sum to total 

Однако эта модель не использует много потоков. За один раз вы выполняете только один поток.

Что вам нужно сделать, это создать все потоки и сохранить их в массиве. Затем дождитесь завершения каждого потока и добавьте его сумму в общую сумму. Что-то вроде:

for i = 0 to num_threads-1 
    threads[i] = pthread_create(&threads[i], NULL, &sums[i], ...) 

А потом

for i = 0 to num_threads-1 
    pthread_join(&threads[i], ...); 
    sum += sums[i]; 

Таким образом, все ваши потоков работают одновременно, и жмешь результат только тогда, когда нить сделано.