2012-10-14 116 views
0

了pthread_exit問題,我有一個結構返回結構

typedef struct something_t { 
    int a; 
    int b; 
} VALUES; 

在我的線程函數我做

VALUES values; 
values.a = 10; 
values.b = 11; 

pthread_exit((void*)&values); 

我嘗試做

VALUES values; 
pthread_join(thread, (void*)&values); 
printf("A: %d\B: %d\n", values.a, values.b); 

我收到的值接收每次都很奇怪。 我很困惑如何接收我最終在線程中創建的值。我想在C中學習線程,看起來好像我已經掌握了它,但是我不能返回值。有沒有辦法?感謝任何人的幫助。

回答

5

您正試圖返回一個堆棧(本地)變量。

這是不允許的,並且不起作用,因爲當線程退出時,線程的堆棧將被刪除(或者至少是無效的)。

要解決這個問題:

VALUES *values = malloc(sizeof VALUES); 
values->a = 1; 
values->b = 2; 
pthread_exit(values); 

然後,當你加入自由價值觀

VALUES *res; 
pthread_join(thread, &res); 
... 
free(res); 
+0

令人驚歎!非常感謝,我沒有意識到堆棧會在每個新線程的末尾被轉儲,但是我注意到一個新的內存被分配給了每個線程中的全局變量而不是全局變量。 – Quillion

1

看起來像你正在線程函數上創建一個堆棧對象,並使用它在pthread_exit。當線程函數退出時,該結構超出範圍,並且您將留下垃圾。

您沒有使用您傳遞給pthread_join的值結構。

1

你的應用程序有一個未定義的行爲,因爲你宣佈堆棧上的結構(和堆棧

:一個退出線程)

使用malloc代替

1

添加到perh's answer:在需要的地方使用指針類型轉換。

線程函數:

VALUES *values = (VALUES*) malloc(sizeof VALUES); 
values->a = 1; 
values->b = 2; 
pthread_exit((void*)values); 

調用函數:

VALUES *res; 
pthread_join(thread_id, (void*)&res); 
... 
free(res); 

這是安全的,它不會產生對編譯警告。