2017-04-20 57 views
-1

我正在嘗試使用多線程程序,並且pthread_join函數出現錯誤。從這段代碼的輸出是:pthread_join之後的分段錯誤(核心轉儲)

after pthread_create 
Segmentation fault (core dumped) 

這裏是代碼:

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

void *myfunc1() 
{ 
    // code segments 
    pthread_exit(sum1);    
} 

void *myfunc2() 
{ 
    // code segments  
    pthread_exit(sum2);  
} 


int main(int argc, char *argv[]) 
{ 

    void *sum1, *sum2; 
    pthread_t thread_id1,thread_id2; 

    pthread_create(&thread_id1,NULL,myfunc1,NULL); 
    pthread_create(&thread_id2,NULL,myfunc2,NULL); 
printf("after pthread_create\n"); 
    pthread_join(thread_id1, &sum2); 
    pthread_join(thread_id2, &sum1); 
printf("after pthread_join\n"); 
    float firstSum = *((float *)sum1); 
    float secondSum = *((float *)sum2); 

    printf("Sum is %.5f\n\n", firstSum+secondSum); 
    return 0; 
} 
+3

這是不是一個[MCVE] - 它不編譯! –

+0

@PaulR它們被初始化,但在海報錯過的位的線程中。它們可能是指向float類型自動變量的指針。 – JeremyP

回答

2

sum1sum2未初始化。所以這些行

float firstSum = *((float *)sum1); 
float secondSum = *((float *)sum2); 

取消引用未定義的指針。

你的線程函數應該傳回一個指針(指向函數出口時能夠存活的東西),然後pthread_join可以使用它。

void *myfunc1() 
{ 
    float *ret = malloc(sizof *ret); 
    *ret = 3.14; 
    // code segments 
    pthread_exit(ret);    
} 

然後在主

float *sum1; 

// run the thread 

pthread_join(thread_id2, (void**)&sum1); 

float result = *sum1; 
free(sum1); 
+0

@KlasLindbäck這是有道理的。在你寫評論時,我修改了我的答案。 – JeremyP

+0

@KlasLindbäck好的一點,謝謝。 – JeremyP

+0

謝謝。問題是我的線程函數不會傳回指針。 –

0

你分段故障發生在你的線程之一。 pthread_create()創建並啓動您的線程,pthread_join()使您的主線程等待其他線程的結束。您的主線程繼續運行,並開始等待其他線程結束,但其中一個線程創建了分段錯誤,因此您的主線程不會顯示「after pthread_join」。所以分段錯誤不是來自pthread_join()。

+1

不是。這根本不是問題的原因。特別是考慮到所有的線程無所作爲。 – JeremyP

+0

經過反思,反對意見很苛刻,因爲這個問題忽略了可能很重要的細節,所以我已經收回了它。 – JeremyP