2013-12-17 6 views
1

Я пытаюсь умножить две матрицы с помощью многопоточности. Но код дает ошибку сегментации. Я передаю номер строки и номер столбца, используя структуру. Матрицы a и b становятся глобальными. Это не совсем правильный способ сделать это, но я просто пытаюсь понять, как работает многопоточность.ошибка сегментации в многопоточной программе

#include <pthread.h>  
#include <unistd.h> 
#include <iostream> 
using namespace std; 
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 
int b[3][2]={{1,2},{3,4},{5,6}}; 
int c[3][2]; 
int k =3; 
struct thread_data{ 
int m; 
int n; 
}; 
void* do_loop(void* threadarg) 
{ 
int p,q; 
struct thread_data *my_data; 

my_data = (struct thread_data *) threadarg; 
int i=my_data->m; 
int j=my_data->n; 
c[i][j]=0; 

for(q=0;q<k;q++) 
{ 
    c[i][j]=c[i][j]+a[i][q]*b[q][j]; 
} 

pthread_exit(NULL); 
} 
int main(int argc, char* argv[]) 
{ 
    int i,j,k; 
struct thread_data td[6]; 

int  thr_id;  
pthread_t p_thread[6];  
int count=0; 
for(i=0;i<3;i++) 
for(j=0;j<2;j++) 
{ 
    td[count].m=i; 
    td[count].n=j; 

thr_id = pthread_create(&p_thread[count], NULL, do_loop, (void*)&td[count]); 
// pthread_join(p_thread[count],NULL); 
count++; 
} 
return 0; 
} 

Как исправить ошибку сегментации?

+0

Какая строка точно? Если вы упростите отладку, люди будут готовы помочь вам. – erbdex

+0

im не отлаживает код, поэтому я не могу получить номер строки, где он получает ядро. – user3110413

+0

Одна из проблем заключается в том, что вы никогда не вызываете pthread_join(), поэтому ваш main() скорее всего вернется (и ваш выход из программы), пока ваш рабочие потоки все еще работают. Вы должны вызвать pthread_join() для каждого потока до конца main(), чтобы избежать этой проблемы. –

ответ

1

Первое, что вам нужно ждать, пока все нити, чтобы закончить (в main):

for (i = 0; i < count; ++i) { 
    pthread_join(p_thread[i],NULL); 
} 

Невыполнение этого требования приведет к сбою приложения, как нить продолжать работать, почему приложение разрушается. После того, как вы создадите все темы, вам необходимо позвонить pthread_join.

Если вы создаете поток и сразу вызываете pthread_join, вы выполняете серию, так как один поток активен в любой момент времени.

Объяснение:

"Join" означает: "ждать завершения потока выполнения". Нить завершает выполнение, когда либо он возвращается из своей функции точки входа (функция передана pthread_create), либо она вызывает pthread_exit.

+0

спасибо egur.it был моим первым вопросом о stackoverflow, и я очень рад, что хочу, чтобы вы объяснили, как это работает. – user3110413

+0

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

Смежные вопросы