线程间的參数传递

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

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

而利用进程间的參数传递能够解决这一问题。

两个方向的參数传递:

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

就可以

时间: 2024-10-10 08:26:38

线程间的參数传递的相关文章

ionic新手教程第七课-简要说明几种界面之间的參数传递及优缺点

截至2016年4月13日19点32分,我公布的ionic新手教程,已经公布6课了, 总訪问量将近6000,平均每节课能有1000的訪问量.当中訪客最多的是第三课有2700的訪客. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 事实上我開始的时候计划的挺好的,就依照我这阶段的安排,慢慢的带大家做一个

struts开发&amp;lt;struts中的參数传递.三&amp;gt;

不说废话,直接上干货 1.通过set和get传递參数 添加username 和password两个属性并添加set和get方法 package fzl.user.struts.demo; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private String u

參数传递(引用,指针,值传递)C++11

C++中,函数的參数传递方式有值传递.地址传递.传地址有指针和引用方式. 在函数參数中,传地址的理由有: 1.使被调函数能够改动主调函数中的数据对象: 2.传地址能够降低数据拷贝,提高程序运行速度. 那么,何时使用值传递,何时使用地址传递(指针和引用)? 以下是一些写代码时会遇到的一些情况 被调函数使用參数对象时,不会改动数据对象 假设要传入函数的数据对象较小,比方是内建数据类型或小规模的结构体,那么使用值传递: 假设数据对象是数组,那么使用指针(这也是你唯一的选择).指针加入const修饰:

C语言函数參数传递原理

C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递.还有一种是通过寄存器的方式传递的. 这次.我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍. 首先,我们看一下,以下一个简单的调用例程: int Add (int a, int b, int c) { return a+b+c; } void main() { int x =0 , y = 1, z = 2; int result = 0; result = Add(x, y, z); printf("Re

继承中參数传递及调用顺序

一.简单派生类的构造函数传參 C++语言的继承特性,指子类能够继承父类的属性和行为,并能够又一次定义或加入新的属性和行为. 父类中为private型的属性和行为尽管被继承,可是子类中仍不能訪问.在继承机制下.构造函数是不能被继承的,所以基类构造函数的參数要由子类构造函数传. 单一继承的子类构造函数的声明(.h中)形式为: 派生类构造函数名(參数总表) (); 单一继承的子类构造函数的定义(.cpp中)形式为: 派生类名::派生类构造函数名(參数总表) : 基类构造函数名 (參数名表) { 派生类

体验函数參数传递

#include <iostream> using namespace std; void fun1(int &x,int &y); void fun2(int *x,int *y); int main() { int a,b; a=11; b=22; fun2(&a,&b); cout<<"a="<<a<<" b="<<b<<endl; fun1(a,b); c

oc 可变參数传递

- (id)initWithFrame:(CGRect)frame delegate:(id<SGFocusImageFrameDelegate>)delegate focusImageItems:(SGFocusImageItem *)firstItem, ... { self = [super initWithFrame:frame]; if (self) { NSMutableArray *imageItems = [NSMutableArray array]; SGFocusImage

管理线程之向线程函数传递參数

向线程函数传递參数在构造线程对象时就可以完毕.可是要记住,默认情况下是把參数复制到线程内部,即使在函数中使用的是引用.比如 void f(int i,std::string const &s); std::thread t(f,3,"hello"); 上面代码中,函数f的第二个參数是std::string,传递的是char const *会转换为string. 当使用指针指向自己主动变量时.要特别注意: void f(int i, std::string const&

[javase学习笔记]-6.6 基本数据类型參数与引用数据类型參数的传递过程

这一节基本数据类型參数和引用数据类型參数的传递过程. 数据类型參数和引用參数我们在前面章节中都已涉及到了,那么我们来看看以下的两段代码: //基本数据类型參数传递 class Demo { public static void main(String[] args) { int x = 3; change(x);//调用方法 System.out.println("x = " + x);// } public static void change(int x) { x = 4; } }