pthread_exit发出返回结构

时间:2012-10-14 22:33:19

标签: c multithreading pthreads pthread-join

我有一个结构

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 个答案:

答案 0 :(得分:5)

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

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

解决此问题:

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

然后,当你加入免费值

VALUES *res;
pthread_join( thread, &res );
...
free(res);

答案 1 :(得分:1)

看起来就像是在线程函数上创建堆栈对象并在pthread_exit中使用它。当线程函数退出时,该结构超出了范围,并且您将留下垃圾。

您没有使用传递给pthread_join的值struct。

答案 2 :(得分:1)

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

改为使用malloc

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

pthread_exit(values);

答案 3 :(得分:1)

添加到perh's answer:在必要的地方使用指针类型转换。

线程功能:

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

这是安全的,它不会在编译时产生警告。