繁体   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