[英]How can I make my QThread block and wait for a function called from the main thread to return a value?
[英]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.