码迷,mamicode.com
首页 > 编程语言 > 详细

线程间的参数传递

时间:2014-06-16 14:34:54      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:class   blog   code   tar   使用   文件   

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

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

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

两个方向的参数传递:

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\n", *(((data *) ret)->a));
  printf ("b=%ld\n", *(((data *) ret)->b));
}


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

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

gcc test.c -lpthread

./a.out

即可

线程间的参数传递,布布扣,bubuko.com

线程间的参数传递

标签:class   blog   code   tar   使用   文件   

原文地址:http://blog.csdn.net/u010839382/article/details/31007065

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!