线程间的参数传递
来源:互联网 发布:京九直通车知乎 编辑:程序博客网 时间:2024/05/22 11:15
在多线程编程中,常常需要从主线程传递参数给子线程或在主线程中获得子线程的计算结果,
若使用全局变量实现,必然需要对临界区保护,因此导致大量的切换工作造成效率的低下;
而利用进程间的参数传递可以解决这一问题。
两个方向的参数传递:
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
即可
1 0
- 线程间的参数传递
- 线程间传递参数
- c#线程间传递参数
- c#线程间传递参数
- c#线程间传递参数
- C#线程间传递参数
- c#线程间传递参数
- c#线程间传递参数
- 线程间的数据共享与参数传递
- 启动线程时传递参数的方法
- c#给线程传递参数的方法
- pthread_create()给创建的线程传递参数
- CreateThread给线程函数传递的参数
- c#线程间传递参数详解
- boost线程间通信和传递参数
- 线程中传递参数
- 给线程传递参数
- C#线程传递参数!!
- 用户和组的管理
- 将u-boot2014.04移植到mini2440上的一些想法
- 中国制造世界杯就差个国足 随处可见中国元素
- VB.net 学习总结
- How to pause the game in Uniy3D
- 线程间的参数传递
- Android+3D游戏开发技术详解与典型案例
- postgres 之 initdb 源码分析 二
- NDK/JNI学习--导入hello-jni工程
- DB2 配置
- unicode ascii 互转 函数 C实现
- 【C语言复习(十二)】数组基础
- Android 3D游戏基础介绍
- POJ 1789-Truck History