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

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

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

两个方向的参数传递:

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

即可

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

线程间的参数传递 分类: linux c/c++ 2014-06-15 17:48 607人阅读 评论(0) 收藏的更多相关文章

  1. strace使用详解(转) 分类: shell ubuntu 2014-11-27 17:48 134人阅读 评论(0) 收藏

    (一) strace 命令    用途:打印 STREAMS 跟踪消息. 语法:strace [ mid sid level ] ... 描述:没有参数的 strace 命令将所有的驱动程序和模块中的 ...

  2. APP被苹果APPStore拒绝的各种原因 分类: ios相关 app相关 2015-06-25 17:27 200人阅读 评论(0) 收藏

    APP被苹果APPStore拒绝的各种原因 1.程序有重大bug,程序不能启动,或者中途退出. 2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币. 3.游戏里有实物奖励的话,一定要说清楚,奖励 ...

  3. Java中的日期操作 分类: B1_JAVA 2015-02-16 17:55 6014人阅读 评论(0) 收藏

    在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception { SimpleDateFormat sdf = n ...

  4. 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏

    一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...

  5. OpenMP对于嵌套循环应该添加多少个parallel for 分类: OpenMP C/C++ Linux 2015-04-27 14:48 53人阅读 评论(0) 收藏

    一个原则是:应该尽量少的使用parallelfor, 因为parallel for也需要时间开销.即: (1)如果外层循环次数远远小于内层循环次数,内层循环较多时,将parallel for加在内层循 ...

  6. ubuntu中安装jdk 分类: java 学习笔记 linux ubuntu 2015-07-06 17:49 74人阅读 评论(0) 收藏

    参考文献:ubuntu 13.04 安装 JDK 先去oracle官网下载jdk,这一段我就不赘述了. 下载好之后先解压,解压方式参见 linux常用的压缩与解压缩命令 ,解压之后,将文件剪贴至/us ...

  7. shell入门之函数应用 分类: 学习笔记 linux ubuntu 2015-07-10 21:48 77人阅读 评论(0) 收藏

    最近在学习shell编程,文中若有错误的地方还望各位批评指正. 先来看一个简单的求和函数 #!/bin/bash #a test about function f_sum 7 8 function f ...

  8. 线程之一:JAVA线程基础 分类: B1_JAVA 2013-10-10 12:48 662人阅读 评论(0) 收藏

    参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流.   (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程: ...

  9. Raspberry Pi + 3个USB摄像头 + Motion(简易监控设备配置记录1——介绍以及安装) 分类: Raspberry Pi 服务器搭建 2015-04-12 19:21 226人阅读 评论(0) 收藏

    参考: Debian官网链接 Motion官网链接 首先,参见Debian官网链接对Motion的介绍,网页中包含了所有相关依赖包,请首先确保这些依赖包的安装. Motion介绍 摘出对Motion的 ...

随机推荐

  1. linux上安装启动elasticsearch-5.5.1完整步骤

    linux上安装启动elasticsearch-5.5.1完整步骤 学习了:https://blog.csdn.net/hingcheung/article/details/77144574 http ...

  2. OSX: 第三方部署Profile的方法和比較

    眼下至少有三个第三方部署Profile的方法. 一个Profile Handler, 是利用Launchd对制定文件夹改变而激活的机制,把须要的profiles文件斗存放在制定目标机器的文件夹内,系统 ...

  3. 为什么不建议用Table布局

    Tables的缺点 1.Table要比其它html标记占很多其它的字节.(延迟下载时间.占用server很多其它的流量资源.) 2.Tablle会阻挡浏览器渲染引擎的渲染顺序.(会延迟页面的生成速度, ...

  4. Cleave js 使用

    1111111111111111 xxxxxx Cleave.js 键入时格式化< input />内容   信用卡号码格式 明确   美国运通:从34/37开始 34   签证:从4开始 ...

  5. TF-IDF与余弦类似性的应用(一):自己主动提取关键词

    作者: 阮一峰 日期: 2013年3月15日 原文链接:http://www.ruanyifeng.com/blog/2013/03/tf-idf.html 这个标题看上去好像非常复杂,事实上我要谈的 ...

  6. envoy

    微服务意味着网络更加依赖于服务抽象边界. 随着相互依赖的服务数量日渐增长,系统100%没问题的时间会变少,整个系统经常有部分功能处于降级状态.

  7. The android gradle plugin version 2.3.0-beta2 is too old, please update to the latest version.

    编译项目的时候,报如下错误: Error:(, ) A problem occurred evaluating project ':app'. > Failed to apply plugin ...

  8. AutoIT: 下载文件函数

    Func down() $Size=InetGetSize($a[$j][]);获得FTP上的文件的大小 InetGet($a[$j][],$a[$j][],,);下载 ProgressOn(],), ...

  9. Python3列表、元组、字典、集合的方法

    一.列表 温馨提示:对图片点右键——在新标签页中打开图片: 1.count() 定义:统计指定元素在列表中出现的次数并返回这个数.若指定的元素不存在则返回:0. 格式:[列表].count(“指定元素 ...

  10. windows 2003 server 64 位 IIS 6下部署 32位网站

    在 C:\WINDOWS\system32\inetsrv\MetaBase.xml 设置节点 在 开始--->运行--->输入一下代码,回车即可,就会跳出正在安装NET2.0 代码为   ...