我有一个结构
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中学习线程,似乎我已经掌握了它,但我无法返回值。有办法吗?感谢任何人的帮助。
答案 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);
这是安全的,它不会在编译时产生警告。