如何从C中的线程返回一个值
我是新来的C,并想玩一些线程。 我想使用pthread_exit()
从一个线程返回一些值
我的代码如下:
#include <pthread.h> #include <stdio.h> void *myThread() { int ret = 42; pthread_exit(&ret); } int main() { pthread_t tid; void *status; pthread_create(&tid, NULL, myThread, NULL); pthread_join(tid, &status); printf("%d\n",*(int*)status); return 0; }
我期望程序输出“42 \ n”,但它输出一个随机数。 我怎样才能打印返回的值?
编辑:根据第一个答案的问题是,我正在返回指向本地variables的指针。 返回/存储multithreadingvariables的最佳做法是什么? 全局哈希表?
提前致谢
你正在返回一个局部variables的地址,这个variables在线程函数退出时不再存在。 无论如何,为什么要调用pthread_exit? 为什么不简单地从线程函数返回一个值?
void *myThread() { return (void *) 42; }
然后在主要:
printf("%d\n",(int)status);
如果你需要返回一个复杂的值这样的结构,可能最容易通过malloc()dynamic分配并返回一个指针。 当然,启动线程的代码将负责释放内存。
你已经返回了一个指向局部variables的指针。 即使线程不涉及,这也很糟糕。
通常的做法是,当启动的线程与连接的线程相同时,将指针指向由调用者pipe理的位置的int,作为pthread_create的第四个参数。 这成为线程入口点的(唯一的)参数。 你可以(如果你喜欢)使用线程退出值来表示成功:
#include <pthread.h> #include <stdio.h> int something_worked(void) { /* thread operation might fail, so here's a silly example */ void *p = malloc(10); free(p); return p ? 1 : 0; } void *myThread(void *result) { if (something_worked()) { *((int*)result) = 42; pthread_exit(result); } else { pthread_exit(0); } } int main() { pthread_t tid; void *status = 0; int result; pthread_create(&tid, NULL, myThread, &result); pthread_join(tid, &status); if (status != 0) { printf("%d\n",result); } else { printf("thread failed\n"); } return 0; }
如果你绝对必须使用线程结束的退出值,那么你必须dynamic分配它(并且确保连接线程的人释放它)。 不过这并不理想。
这是一个正确的解决scheme。 在这种情况下,tdata被分配在主线程中,并且线程有一个空间来放置结果。
#include <pthread.h> #include <stdio.h> typedef struct thread_data { int a; int b; int result; } thread_data; void *myThread(void *arg) { thread_data *tdata=(thread_data *)arg; int a=tdata->a; int b=tdata->b; int result=a+b; tdata->result=result; pthread_exit(NULL); } int main() { pthread_t tid; thread_data tdata; tdata.a=10; tdata.b=32; pthread_create(&tid, NULL, myThread, (void *)&tdata); pthread_join(tid, NULL); printf("%d + %d = %d\n", tdata.a, tdata.b, tdata.result); return 0; }
我想你必须把这个号码存储在堆上。 int ret
variables在堆栈上并在函数myThread
的执行结束时被破坏。
void *myThread() { int *ret = malloc(sizeof(int)); if (ret == NULL) { // ... } *ret = 42; pthread_exit(ret); }
不要忘了free
它,当你不需要它:)
另一个解决scheme是将该数字作为指针的值返回,就像Neil Butterworth所build议的那样。
你正在返回一个参考ret ,它是栈上的一个variables。
#include<stdio.h> #include<pthread.h> void* myprint(void *x) { int k = *((int *)x); printf("\n Thread created.. value of k [%d]\n",k); //k =11; pthread_exit((void *)k); } int main() { pthread_t th1; int x =5; int *y; pthread_create(&th1,NULL,myprint,(void*)&x); pthread_join(th1,(void*)&y); printf("\n Exit value is [%d]\n",y); }
问题:返回/存储multithreadingvariables的最佳做法是什么? 全局哈希表?
这完全取决于你想要返回什么,你将如何使用它? 如果你只想返回线程的状态(说明线程是否完成了它想做的事情),那么就使用pthread_exit或者使用return语句从线程函数返回值。
但是,如果你想要更多的信息将被用于进一步处理,那么你可以使用全局数据结构。 但是,在这种情况下,您需要使用适当的同步原语来处理并发问题。 或者你可以分配一些dynamic的内存(最好是存储数据的结构),并通过pthread_exit发送,一旦线程join,就可以在另一个全局结构中进行更新。 通过这种方式,只有一个主线程将更新全局结构,解决了并发问题。 但是,您需要确保释放由不同线程分配的所有内存。
如果你不喜欢返回地址,只有一个variables,例如。 一个返回的整数值,你甚至可以在传递它之前将它转换成(void *),然后当你在main中收集它时,再次将它转换为(int)。 你有没有抛出丑陋的警告的价值。