Я пытаюсь умножить две матрицы с помощью многопоточности. Но код дает ошибку сегментации. Я передаю номер строки и номер столбца, используя структуру. Матрицы 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;
}
Как исправить ошибку сегментации?
Какая строка точно? Если вы упростите отладку, люди будут готовы помочь вам. – erbdex
im не отлаживает код, поэтому я не могу получить номер строки, где он получает ядро. – user3110413
Одна из проблем заключается в том, что вы никогда не вызываете pthread_join(), поэтому ваш main() скорее всего вернется (и ваш выход из программы), пока ваш рабочие потоки все еще работают. Вы должны вызвать pthread_join() для каждого потока до конца main(), чтобы избежать этой проблемы. –