簡體   English   中英

如何從線程函數返回值?

[英]How do I return a value from thread function?

我有這樣的結構:

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);

但是當我想使用以下方法將我的線程函數中的值返回到main()時:

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

我不確定會發生什么,因為我的程序似乎什么都不做。 它編譯並運行,但它在某個地方無限循環或只是等待某事。 我不確定會發生什么,我只是沒有得到任何回應。 我究竟做錯了什么? 我在main()中缺少從pthread_join語句中檢索值的東西嗎? 也許我搞砸了聲明中的論點?

你的指針很困惑。 像這樣做:

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

雖然可以指針轉換為void指針,但您不能只假裝X類型的變量(在您的情況下為data * )實際上是Y類型的變量(在您的情況下為void * )。 這是不允許的和未定義的行為。

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轉換成了(void **),現在在某個時候pthread_join想要將線程的結果寫入你提供的參數中,所以它說

* (void**) 0xFEDCBA98 = thread_return_value;

可是等等! 你使pthread_join遵循一個無效的指針,它甚至可能產生像分段錯誤或更糟糕的覆蓋你最重要的信息之一! 因此,每當函數需要空間返回某些內容時,您必須為其提供有效的內存。 有效代碼可以是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM