我有这样的结构:
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语句中检索值的东西吗?也许我搞砸了声明中的论点?
答案 0 :(得分:1)
你的指针很困惑。这样做:
void * p;
pthread_join(threadID, &p);
data * returnedItem = static_cast<data *>(p);
虽然可以转换指针和指向void指针,但你不能只假装X
类型的变量(在你的情况下为data *
)实际上是类型为Y
的变量(在您的情况下为void *
)。这是不允许的和未定义的行为。
答案 1 :(得分: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投入(void **),现在在pthread_join
想要的某个时刻
将线程的结果写入由您提供的参数中,以便说出
* (void**) 0xFEDCBA98 = thread_return_value;
但是等等!你让pthread_join
尊重无效指针,它甚至可能产生像分段错误或更糟糕的覆盖你最重要的信息之一!因此,每当函数需要空间返回某些内容时,您必须为其提供有效的内存。有效代码可以是:
pthread_join(threadID, (void**) &returnedItem );