我正在嘗試使用多線程來乘以兩個矩陣。但是代碼給出了分段錯誤。我使用結構傳遞行號和列號。矩陣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
即時通訊不調試代碼,所以我無法獲得行號,它是核心傾銷 – user3110413
一個問題是,你永遠不會調用pthread_join(),所以你的main()可能會返回(和你的程序退出),而你的工作線程仍在工作。您應該在main()結束之前爲每個線程調用pthread_join(),以避免該問題。 –