2013-12-17 89 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

即時通訊不調試代碼,所以我無法獲得行號,它是核心傾銷 – user3110413

+0

一個問題是,你永遠不會調用pthread_join(),所以你的main()可能會返回(和你的程序退出),而你的工作線程仍在工作。您應該在main()結束之前爲每個線程調用pthread_join(),以避免該問題。 –

回答

1

第一件事情,你需要等待所有線程完成(在main):

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

否則會崩潰您的應用程序的線程繼續工作,爲什麼應用程序被銷燬。 創建所有線程後,您需要調用pthread_join

如果您創建線程並立即調用pthread_join您的執行是串行的,因爲在任何給定時間一個線程處於活動狀態。

說明:

「加入」意味着:「等待線程完成執行」。當線程從入口點函數返回(函數傳遞給pthread_create)或者它調用pthread_exit時,線程完成執行。

+0

感謝egur.it是我在stackoverflow上的第一個問題,我非常高興bt我想要你解釋這個連接的工作原理。 – user3110413

+0

查看更新的答案。 – egur