zoukankan      html  css  js  c++  java
  • 线程间的参数传递 分类: linux c/c++ 2014-06-15 17:48 607人阅读 评论(0) 收藏

    在多线程编程中,常常需要从主线程传递参数给子线程或在主线程中获得子线程的计算结果,

    若使用全局变量实现,必然需要对临界区保护,因此导致大量的切换工作造成效率的低下;

    而利用进程间的参数传递可以解决这一问题。

    两个方向的参数传递:

    1.主线程向子线程传递参数:

    通过函数 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

    在创建线程时,利用参数arg传递参数给子线程.

    2.子线程向主线程传递参数:

    通过函数 int pthread_join(pthread_t thread, void **retval);

    主线程等待子线程结束,从参数retval读取子线程的返回值.

    在需要传递多个简单结构参数的时候,通常将线程间传递的参数定义为一个结构体。

    下面是一个简单的例子:

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct data//线程间传递的参数结构
    {
      long *a;
      long *b;
    } data;				
    void *thread_handle (void *args)//线程处理函数
    {
      data *rev = (data *) args;
      data *ret = (data *) malloc (sizeof (data));
      ret->a = (long *) malloc (sizeof (long));
      ret->b = (long *) malloc (sizeof (long));
      *(ret->a) = 2 *(* (rev->a));
      *(ret->b) = 2 *(* (rev->b));
      return (void *) ret;
    }
    
    int main ()
    {
      pthread_t pid;
      void *ret;
      data *tmp = (data *) malloc (sizeof (data));
      tmp->a = (long *) malloc (sizeof (long));
      tmp->b = (long *) malloc (sizeof (long));
      *(tmp->a) = 5;
      *(tmp->b) = 6;
      pthread_create (&pid, NULL, thread_handle, (void *) tmp);
      pthread_join (pid, &ret);
      printf ("a=%ld
    ", *(((data *) ret)->a));
      printf ("b=%ld
    ", *(((data *) ret)->b));
    }


    上述程序利用子线程将主线程传递来的参数各自乘2后返回,主线程接收返回结果并输出

    假设源文件为test.c,执行

    gcc test.c -lpthread

    ./a.out

    即可

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    <script>元素
    女朋友问什么是动态规划,应该怎么回答?
    从输入URL到页面展示,这中间都发生了什么?
    TypeScript之父:JS不是竞争对手,曾在惧怕开源的微软文化中艰难求生
    Flash 终将谢幕:微软将于年底停止对 Flash 的支持
    尤雨溪:TypeScript不会取代JavaScript
    JVM参数设置、分析(转发)
    -XX:PermSize -XX:MaxPermSize 永久区参数设置
    堆的分配参数
    -Xmx 和 –Xms 设置最大堆和最小堆
  • 原文地址:https://www.cnblogs.com/luo-peng/p/4646248.html
Copyright © 2011-2022 走看看