1

我有一个结构

typedef struct something_t {
    int a;
    int b;
} VALUES;

在我的线程函数中,我做

VALUES values;
values.a = 10;
values.b = 11;

pthread_exit((void*)&values);

我试着通过做来接受

VALUES values;
pthread_join(thread, (void*)&values);
printf("A: %d\B: %d\n", values.a, values.b);

我收到的价值观每次都很奇怪。我对如何接收我最终在线程中创建的值感到困惑。我正在尝试学习 C 中的线程,似乎我已经掌握了它,但我无法返回值。有办法吗?感谢任何人的帮助。

4

4 回答 4

6

您正在尝试返回堆栈(本地)变量。

这是不允许的,并且不会起作用,因为线程的堆栈将在线程退出时被删除(或至少是无效的)。

要解决这个问题:

VALUES *values = malloc(sizeof VALUES);
values->a = 1;
values->b = 2;
pthread_exit( values );

然后,当你加入免费的价值观

VALUES *res;
pthread_join( thread, &res );
...
free(res);
于 2012-10-14T22:37:03.760 回答
1

看起来就像您正在线程函数上创建一个堆栈对象并在pthread_exit. 当线程函数退出时,该结构超出范围,您将留下垃圾。

您没有使用传入的值结构pthread_join

于 2012-10-14T22:36:40.850 回答
1

您的应用程序具有未定义的行为,因为您在堆栈(以及已退出线程的堆栈)上声明了结构

改用malloc

VALUES *values = malloc(sizeof(VALUES);
values->a = 10;
values->b = 11;

pthread_exit(values);
于 2012-10-14T22:37:20.500 回答
1

添加到perh 的答案:在必要时使用指针类型转换。

线程函数:

VALUES *values = (VALUES*) malloc(sizeof VALUES);
values->a = 1;
values->b = 2;
pthread_exit( (void*)values );

调用函数:

VALUES *res;
pthread_join( thread_id, (void*)&res );
...
free(res);

这是安全的,并且不会在编译时生成警告。

于 2016-10-10T09:05:35.710 回答