2012-10-20 97 views
0

我有這樣的結構:如何從線程函數返回值?

struct data{ 
    int x; 
    int y; 
} 

,我有一個線程函數,看起來像這樣:

void *threadFunction(void *item){ 
    data *myData = (data*) item; 
    int first = 50; 
    int second = 10; 
    myData->x = first; 
    myData->y = second; 
    return(void*) myData; 
} 

我調用線程函數像這樣在main():

pthread_create(threadID, NULL, threadFunction, &item); 

但是當我想從我的線程函數獲取值回主()使用此:

struct data* returnedItem; 
pthread_join(threadID, (void**) returnedItem; 
cout << returnedItem->x << returnedItem->y; 

我不知道會發生什麼我的計劃似乎只是什麼也不做。它編譯並運行,但它在某處無限循環或只是等待某個東西。我不確定會發生什麼,我只是沒有得到任何迴應。我究竟做錯了什麼?在main()中是否存在缺少pthread_join語句中的值的東西?也許我在聲明中弄亂了論據?

+1

爲什麼要麻煩。如果你只是返回一個指針到原來的事情,只是不停地用'&item' ... –

+2

這是不是你真正的代碼,它甚至不會編譯。 –

回答

1

你得到你的指點混淆。像這樣做:

void * p; 
pthread_join(threadID, &p); 
data * returnedItem = static_cast<data *>(p); 

雖然有可能從轉換指針和空指針,你不能只是假裝X型(在你的情況data *)的變量實際上是一個類型的變量Y(在你的情況下爲void *)。這是不允許的和未定義的行爲。

+0

感謝您的幫助,它開始變得更有意義,但我的程序仍然沒有響應。我是否正確返回指針? – ahabos

+0

@ahabos:是的,雖然你不需要演員,但看起來是正確的。 –

+0

我明白了,這個錯誤並不是傳遞或返回參數。感謝您的幫助,但我明白我現在做得更清楚了! – ahabos

1

pthread_join在其第二個參數中需要一個指向void *的指針來返回線程的結果,所以你寫了pthread_join(threadID, (void**) returnedItem);。但仔細想想:

struct data* returnedItem; 
// what is the value of returnedItem?? possibly garbage, lets say it is 0xFEDCBA98 
pthread_join(threadID, (void**) returnedItem); 

你施放該garbase成(無效**),現在在某些時候pthread_join要 寫線程進入說法,您所提供的結果,所以說

* (void**) 0xFEDCBA98 = thread_return_value; 

但等待!你讓pthread_join到尊重無效的指針,它甚至可能會產生像段故障或您最重要的信息覆蓋更糟糕的一個!所以每次函數需要返回空間時,都必須提供有效的內存。有效的代碼可以是:

pthread_join(threadID, (void**) &returnedItem);