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

但是当我想使用以下方法将线程函数中的值返回到 main() 中时:

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

我不确定会发生什么,因为我的程序似乎什么都不做。它编译并运行,但它在某处无限循环或只是等待某事。我完全不确定会发生什么,我只是没有得到任何回应。我究竟做错了什么?我在 main() 中是否缺少一些东西来从 pthread_join 语句中检索值?也许我搞砸了声明中的论点?

4

2 回答 2

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 );
于 2012-10-21T01:03:50.993 回答
1

你把你的指针弄糊涂了。像这样做:

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

虽然可以指针从 void 指针转换为 void 指针,但您不能假装类型变量X(在您的情况下data *)实际上是类型变量Y(在您的情况下void *)。这是不允许的和未定义的行为。

于 2012-10-20T23:34:08.707 回答