Linux- 线程函数如何将返回值传给主线程

来源:互联网 发布:contabs.js插件 编辑:程序博客网 时间:2024/05/17 22:24

网上找到几种方法,一一记录。


1. 定义一个 包含 线程函数的 参数和返回值的 数据结构

例子如下:

#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;}



2. 用pthread_exit() 返回线程函数的返回值,用pthread_join 来接受 线程函数的返回值。

例子如下:

#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;}


3. 另外,我觉得还可以通过全局变量来实现子线程和主线程的信息传递,但是多线程使用全局变量的时候,要注意线程同步的包含。

下面这段话说的蛮好:

Question : What is the best practice of returning/storing variables of multiple threads? A global hash table?

This totally depends on what you want to return and how you would use it? If you want to return only status of the thread (say whether the thread completed what it intended to do) then just use pthread_exit or use a return statement to return the value from the thread function.

But, if you want some more information which will be used for further processing thenyou can use global data structure. But, in that case you need to handle concurrency issues by using appropriate synchronization primitives.Or you can allocate some dynamic memory (preferrably for the structure in which you want to store the data) and send it via pthread_exit and once the thread joins, you update it in another global structure. In this way only the one main thread will update the global structure and concurrency issues are resolved. But, you need to make sure to free all the memory allocated by different threads.


0 0