线程建立函数参数void *arg深入分析

如果const pthread_attr_t *attr相当于老板招募的职工所具有的业务素质的话,那void *arg就相当于老板能提供给职工的工作条件了。

function:int pthread_create(pthread_t *tid, const pthread_attr_t *attr, (void*)(*start_rtn)(void*), void *arg);

第四个参数要求传入的值为一个指针,也即数据的地址。

  • 单数据传递
int err;
int param = 1;
pthread_t tid;
err = pthread_create(&tid, NULL, myprint, &param);
if (err != 0){printf("can't create thread: %s\n", strerror(err));return EXIT_FAILURE;
}
  • 多数据传递

第四个参数只能传入唯一的一个指针,如果有多个数据,怎么传入呢?

打包!用什么工具能把不同数据类型打包到一起呢?

结构体!

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>typedef struct struct_mypara
{int para1;//参数1int para2;//参数2
}MyParaStruct;void* myprint(void* para){//1.将线程置位分离的,运行结束自动释放资源//pthread_detach(pthread_self());//2.拿到入参,强转为初始类型指针MyParaStruct para0 = (MyParaStruct)(*((MyParaStruct*)para));//输出入参printf("para1 = %d.\n", para0.para1);printf("para2 = %d.\n", para0.para2);return;
}int main(void)
{int err;pthread_t tid;MyParaStruct mypara = {1,2};err = pthread_create(&tid, NULL, myprint, &mypara); if (err != 0){printf("can't create thread: %d.\n", strerror(err));return EXIT_FAILURE;}printf("new thread id = %lu.\n", tid);pthread_join(tid,NULL);return EXIT_SUCCESS;
}

运行环境:ubuntu14.04,平台自带gcc编译器

运行结果:

root@ubuntu:/home/jack# make
gcc -o test test.c -lpthread
root@ubuntu:/home/jack# ./test
new thread id = 3076188992.
para1 = 1.
para2 = 2.
root@ubuntu:/home/jack#

测试程序下载地址:https://download.csdn.net/download/sleeping_sunshine/11579958

以上就是线程建立函数第四个参数void *arg的大体使用方法,如果您觉得有帮助或者有疑问的话,欢迎留言哦~

线程的故事——附2:线程建立函数参数void *arg深入分析相关推荐

  1. 线程的故事(了解线程生命周期)

    第一回 初生牛犊 我是一个线程,我一出生就被编了个号:0x3704,然后被领到一个昏暗的屋子里,在这里我发现了很多和我一模一样的同伴. 我身边的同伴 0x6900 待的时间比较长,他带着沧桑的口气对我 ...

  2. python开发微信群_Python编程:微信群聊程序的开发与进/线程知识汇总(附代码)

    本文承接上篇文章的客户端-服务器聊天对话程序,进一步设计开发了微信群聊的python模拟程序,涉及的python知识点为:Python实战:聊天软件开发与TCP/Socket编程知识汇总(附代码)和 ...

  3. java 线程池 初始大小,Java线程池ThreadPoolExecutor的实现和参数

    接文章Java8线程池--底层为LinkedBlockingQueue的ThreadPoolExecutor,文章中简单介绍了线程池保持线程,并且从阻塞队列中获取任务执行的流程.本篇文章详细介绍线程池 ...

  4. 线程池的执行原则及配置参数详解

    池是一种非常优秀的设计思想,通过建立池可以有效的利用系统资源,节约系统性能.Java 中的线程池就是一种非常好的实现,从 JDK 1.5 开始 Java 提供了一个线程工厂 Executors 用来生 ...

  5. Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义

    为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...

  6. 线程的故事:3 位“母亲”成就了优秀的我!

    作者 | 王磊       责编 | 欧阳姝黎 声明:本故事纯属虚构,如果雷同那就是真事了! 大家好,我是线程,我的英文名叫 Thread,别看我现在风光无限,好像人尽皆知的样子,然而我的身世却悲惨离 ...

  7. 写给大忙人看的进程和线程(内附思维导图)

    我们平常说的进程和线程更多的是基于编程语言的角度来说的,那么你真的了解什么是线程和进程吗?那么我们就从操作系统的角度来了解一下什么是进程和线程. 我们平常说的进程和线程更多的是基于编程语言的角度来说的 ...

  8. 为什么用线程池?解释下线程池参数?线程池处理流程?阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理?

    为什么用线程池?解释下线程池参数? 1.降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗. 2.提高响应速度:任务来了,直接有线程可用可执行,而不是先创建线程,再执行. 3.提高线程的可管理性: ...

  9. 线程池详解:线程池的七大参数及运行流程

    尽管 Executors 的工厂方法使用方便,在生产场景被很多企业的开发规范所禁用.要求通过标准构造器 ThreadPoolExecutor 去构造工作线程池. 1. 核心数据结构 public cl ...

最新文章

  1. IDEA 连接MySQL数据库
  2. Android UI进阶之旅9 Material Design之沉浸式设计
  3. 使用克隆配置任务配置边缘传输服务器角色
  4. java 异常_Java学习——异常与异常处理
  5. 牛客 - lglg说要有题,于是便有了题。(欧拉线性筛+打表+思维)
  6. 信息学奥赛一本通C++语言——1107:校门外的树
  7. Cityengine, 3ds MAX, FME
  8. Goldbach's Conjecture--POJ 2262
  9. CF EDU - E. Lomsat gelral 树上启发式合并
  10. Kotlin中正则表达式分析
  11. 共享茶室小程序开发解决方案
  12. 【python】使用python绘制地图时手动添加比例尺
  13. [转]仙剑4破解方法详解[图]
  14. navigator、history对象
  15. 【基础】603- 深入分析Session和Cookie
  16. 5本财富自由好书的精华
  17. 一起来读书361- 应用密码学:第十一章 数学背景
  18. (邱维声)高等代数课程笔记:基,维数与坐标
  19. Jdk14其他新特性
  20. Mysql分组查询每组最新的一条数据(三种实现方法)

热门文章

  1. spring和jump区别_Hop 及jump 的区别
  2. 2020-08-19
  3. 程序员如何用睡后收入秒杀95%的人?
  4. Android ImageCropper 矩形 圆形 裁剪框
  5. mysql 关键字高级查询并根据精确度排序
  6. 语义分析的一些方法(二)
  7. 论物联网与大数据、云计算、工业物联网、区块链
  8. Xmind序列号/版本: XMind 8 Update 9 (R3.7.9.201912052356)
  9. 联想笔记本关闭切换大小写的提示图标
  10. 阿里云ACP认证考试过关心得经验及考试费用详解