【c语言多线程编程】关于pthread_create()和pthread_join()的多线程详解
关于pthread_create()和pthread_join()的多线程详解
一、首先说一下pthread_create() 函数的用法:
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine) (void *),void *arg);
各参数的含义:
1、pthread_t *thread:
传递一个 pthread_t 类型的指针变量,也可以直接传递某个 pthread_t 类型变量的地址。
pthread_t 是一种用于表示线程的数据类型,每一个 pthread_t 类型的变量都可以表示一个线程。
pthread_t 类型在linux下被定义为: “unsigned long int”
2、const pthread_attr_t *attr:
用于手动设置新建线程的属性,例如线程的调用策略、线程所能使用
的栈内存的大小等。
大部分场景中,我们都不需要手动修改线程的属性,将 attr 参数赋值为 NULL,pthread_create() 函数会
采用系统默认的属性值创建线程。
pthread_attr_t 类型以结构体的形式定义在<pthread.h>头文件中,此类型的变量专门表示线程的属性。
//pthread_attr_t 结构体定义
typedef struct pthread_attr_t pthread_attr_t;
struct pthread_attr_t
{unsigned p_state;void *stack;size_t s_size;struct sched_param param;
};
3、void *(start_routine) (void ):
以函数指针的方式指明新建线程需要执行的函数,该函数的参数最多
有 1 个(可以省略不写),形参和返回值的类型都必须为 void 类型。void 类型又称空指针类型,
表明指针所指数据的类型是未知的。使用此类型指针时,我们通常需要先对其进行强制类型转换,然后
才能正常访问指针指向的数据。
4、void *arg:
指定传递给 start_routine 函数的实参,当不需要传递任何数据时,将 arg 赋值为 NULL
即可。
如果成功创建线程,pthread_create() 函数返回数字 0,反之返回非零值。各个非零值都对应着不同的宏,
指明创建失败的原因,常见的宏有以下几种:
- EAGAIN:系统资源不足,无法提供创建线程所需的资源。
- EINVAL:传递给 pthread_create() 函数的 attr参数无效。
- EPERM:传递给 pthread_create() 函数的 attr参数中,某些属性的设置为非法操作,程序没有相关的设置权限。
二、pthread_join()函数:等待线程执行结束
如果想获取某个线程执行结束时返回的数据,可以调用 pthread_join() 函数来实现。本节,我们就为您详细讲解 pthread_join() 函数的功能和用法。
pthread_join() 函数声明在<pthread.h>头文件中,语法格式如下:
int pthread_join(pthread_t thread, void ** retval);
thread 参数用于指定接收哪个线程的返回值;retval 参数表示接收到的返回值,如果 thread 线程没有返回值,又或者我们不需要接收 thread 线程的返回值,可以将 retval 参数置为 NULL。
pthread_join() 函数会一直阻塞调用它的线程,直至目标线程执行结束(接收到目标线程的返回值),阻塞状态才会解除。如果 pthread_join() 函数成功等到了目标线程执行结束(成功获取到目标线程的返回值),返回值为数字 0;反之如果执行失败,函数会根据失败原因返回相应的非零值,每个非零值都对应着不同的宏,例如:
- EDEADLK:检测到线程发生了死锁。
- EINVAL:分为两种情况,要么目标线程本身不允许其它线程获取它的返回值,要么事先就已经有线程调用 pthread_join() 函数获取到了目标线程的返回值。
- ESRCH:找不到指定的 thread 线程。
以上这些宏都声明在 <errno.h> 头文件中,如果程序中想使用这些宏,需提前引入此头文件。
再次强调,一个线程执行结束的返回值只能由一个 pthread_join() 函数获取,当有多个线程调用 pthread_join() 函数获取同一个线程的执行结果时,哪个线程最先执行 pthread_join() 函数,执行结果就由那个线程获得,其它线程的 pthread_join() 函数都将执行失败。
对于一个默认属性的线程 A 来说,线程占用的资源并不会因为执行结束而得到释放。而通过在其它线程中执行pthread_join(A,NULL);语句,可以轻松实现“及时释放线程 A 所占资源”的目的。
三、结合pthread_create()和pthread_join()创建多线程
#include <stdio.h>
#include <pthread.h>
//定义线程要执行的函数,arg 为接收线程传递过来的数据
void *Thread1(void *arg)
{printf("https://blog.csdn.net/weixin_45541762?type=blog\n");return "Thread1成功执行";
}
//定义线程要执行的函数,arg 为接收线程传递过来的数据
void* Thread2(void* arg)
{printf("笑着的程序员\n");return "Thread2成功执行";
}int main()
{int res;pthread_t mythread1, mythread2;void* thread_result;/*创建线程&mythread:要创建的线程NULL:不修改新建线程的任何属性ThreadFun:新建线程要执行的任务NULL:不传递给 ThreadFun() 函数任何参数返回值 res 为 0 表示线程创建成功,反之则创建失败。*/res = pthread_create(&mythread1, NULL, Thread1, NULL);if (res != 0) {printf("线程创建失败");return 0;}res = pthread_create(&mythread2, NULL, Thread2, NULL);if (res != 0) {printf("线程创建失败");return 0;}/*等待指定线程执行完毕mtThread:指定等待的线程&thead_result:接收 ThreadFun() 函数的返回值,或者接收 pthread_exit() 函数指定的值返回值 res 为 0 表示函数执行成功,反之则执行失败。*/res = pthread_join(mythread1, &thread_result);//输出线程执行完毕后返回的数据printf("%s\n", (char*)thread_result);res = pthread_join(mythread2, &thread_result);printf("%s\n", (char*)thread_result);printf("主线程执行完毕");return 0;
}
[root@localhost ~]# gcc thread.c -o thread.exe -lpthread
在保证程序没有语法错误的前提下,执行此命令会生成一个名为 thread.exe 的可执行文件。需要强调的是,命令中必须包含 “-plthread” 参数,否则会导致程序链接失败。
在当前目录下找到新生成的 thread.exe 文件,执行如下命令即可看到程序的执行结果:
[root@localhost ~]# ./thead.exe
https://blog.csdn.net/weixin_45541762?type=blog
笑着的程序员
Thread1成功执行
Thread2成功执行
主线程执行完毕
程序中共存在 3 个线程,包括本就存在的主线程以及两个调用 pthread_create() 函数创建的线程(又称子线程),其中名为 mythread1 的线程负责执行 thread1() 函数,名为 mythread2 的线程负责执行 thread2() 函数。
程序中调用了两次 pthread_join() 函数,分别令主线程等待 mythread1 线程和mythread2 线程执行完毕后在执行后续的代码。
相关文章:

【c语言多线程编程】关于pthread_create()和pthread_join()的多线程详解
关于pthread_create()和pthread_join()的多线程详解 一、首先说一下pthread_create() 函数的用法: int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine) (void *),void *arg);各参数的含义: 1、pthread_t *thre…...

抖音seo矩阵系统源码搭建技术+二开开源代码定制部署
抖音已经成为了当今最为流行的短视频平台之一,拥有着庞大的用户群体和海量的视频资源。对于一些商家或者运营者来说,如何从这些视频资源中挖掘出有效的信息,进而提升自己的品牌、产品或者内容的曝光度,就成为了一个非常重要的问题…...

【周赛刷题】平衡树+图中最短环
2612. 最少翻转操作数(平衡树) 题目的难度有一部分在于数学推导。对于某个点 iii 进行反转是有一个范围的,这个范围需要考虑到边界的情况。可以的得到的一个结论是。对于窗口反转,KaTeX parse error: Expected group after ^ at p…...

C++笔记——第十篇 继承 的解析,详细易懂哦
目录 一、继承的概念及定义 1.继承的概念 2. 继承定义 2.1定义格式 2.2继承关系和访问限定符 2.3继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、复杂的菱形继承…...

SQL Server中的全文搜索
SQL Server中的全文搜索一、概述二、全文搜索查询三、将全文搜索查询与 LIKE 谓词进行比较四、全文搜索体系结构4.1、SQL Server 进程4.2、过滤器守护程序主机进程五、全文搜索处理5.1、全文索引过程5.2、全文查询流程六、全文索引体系结构6.1、全文索引结构6.2、全文索引片段6…...

自适应平移混音方法
一、简介: 自适应平移混音方法是一种常见的音频混音技术,它利用自适应滤波器对不同音频信号进行平移和加权,从而实现混音。 二、该方法的基本步骤如下: 采集和存储需要混音的音频信号。 对其中一个音频信号进行预处理,…...

炼钢厂VR职业技能实训软件,提高员工学习效率和掌握技能速度
炼钢作业是一个高危、高压、高温的行业,在实际操作中需要严格遵守安全规范和操作规程,一旦出现差错可能造成巨大的经济损失和人员伤亡。 利用广州华锐互动开发的炼钢厂VR职业技能实训软件,可以有效帮助员工更好地理解和掌握炼钢作业中的相关…...

MySQL数据库范式
文章目录MySQL数据库范式1、范式的优缺点2、第一范式3、第二范式4、第三范式5、BC范式6、第四范式MySQL数据库范式 1、范式的优缺点 应用数据库范式的好处: 减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)消除异常&…...

通过多层方法重塑网络安全
多年来,网络安全威胁的复杂性不断增加。此外,随着远程和混合工作场所模式的兴起,网络犯罪分子可以利用的漏洞数量显着增加。由于可能存在的网络威胁的范围如此之广,因此没有一种单一的解决方案可以应对所有威胁。 由于多种原因&a…...

Golang学习+深入(四)-运算符
目录 一、概述 1、算数运算符 2、关系运算符 3、逻辑运算符 4、赋值运算符 5、运算符优先级 6、位运算符 7、其他运算符 二、进制 1、进制转换 1、其他进制转十进制 2、十进制转其他进制 3、二进制转其他进制 4、其他进制转二进制 5、二进制在运算中的说明 三、…...

C++ 运算符重载:C++ 运算符重载的高级技巧和最佳实践
C 运算符重载:深入剖析与实现I. 引言A. 什么是运算符重载B. 为什么要使用运算符重载C. C运算符重载的优缺点II. 运算符重载基本概念A. 运算符重载的定义B. 运算符重载的分类1. 一元运算符2. 二元运算符C. 限制与规范1. 无法重载的运算符2. 重载运算符的规范与建议II…...

软件测试找了2个月了,找不到工作怎么办?
那就问你一些问题,看你能回答多少 1:测试流程是什么?测试用例包含哪些内容?测试用例设计都有哪些?给你一个一次性杯子,你会怎么测试? 2:数据库怎么查看前十行数据?内连接和外连接的区别&#…...

满足高并发的TB API接口接入说明
大家都知道,淘宝的反爬虫机制十分严,而很多时候,没办法高效的拿到数据内容响应终端需求,而依赖爬虫就会造成动不动就出现滑块验证,让人很无解。这里我们分享让采集不再出现任何滑块验证码,完全解密通过&…...

Themis Pro版将正式推出,3次迭代到底在酝酿什么?
最近在社区内讨论火热的Themis Pro,终于要来了!4月2日Themis官网(themis.capital )全新升级改版上线,并宣布Themis Pro 即将于4月下旬正式推出。 Themis Pro 是基于Ve(3,3)模型在FVM公链上搭建的新一代去中…...

边缘检测和轮廓检测
边缘检测 什么是边缘: * 图像中像素值发生剧烈变化的位置(高频信息区域) * 这些区域往往都是图像的边缘 方法:滤波、形态学处理等 边缘的作用 本质上,边缘是不同区域之间的边界。 其中包含了图像的区域信息,形状信息 一方面,可以利用这些信息来作为特征对图像进行理解(甚至…...

二分法模板以及例题 (三)
167. 两数之和 II - 输入有序数组 输入:numbers [2,7,11,15], target 9 输出:[1,2]。 解释:2 与 7 之和等于目标数 9 。因此 index1 1, index2 2 。返回 [1, 2] 解题思路:首先散列表可以直接秒了,双指针也秒了 二分…...

向下转型和向上转型(易理解)
向上转型:父类引用指向子类对象 定义A B C D 四个类,分级继承 对象 a 的编译类型是A,运行类型是B,A是B的父类,父类的引用 a 指向的是B这个子类的对象,因为new的是B这个类,创建的也就是B这个类的…...

华为OD机试用JS实现 -【机智的外卖员】(2023-Q2 押题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:机智的外卖员 题目描述: 外…...

同态加密:一个基于多方计算的CKKS方案
这篇文章主要介绍LattiGo团队搞出来的一个多方同态加密的工作。个人觉得比较优雅,而且有库支持,方便把玩,所以记一下。 在攒毕业论文的时候整了这么个看上去很烂,但是(个人觉得)有一点意思的烂活࿰…...

最小生成数
题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz。 输入格式 第一行包含两个整数 �,�N,M,表示该图共有 �N 个结点和 �M 条无向边。 接下来 …...

【模板】树状数组
目录: 单点修改,区间查询: 题目描述: lowbit()运算: 插入、修改单点数据: 计算前缀和: 完整代码: 区间修改,单点查询: 计算差分数组: 计算每个点的…...

网站都变成灰色了,怎么实现的?
有些时候我们需要把网站页面变成黑白色或灰色,特别是对于一些需要悼念的日子,以及一些影响力很大的伟人逝世或纪念日的时候,都会让网站的全部网页变成灰色(黑白色),以表示我们对逝者或者英雄的缅怀和悼念。…...

NeRF详解
论文标题:《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》 论文地址:https://arxiv.org/abs/2003.08934 推荐代码:https://github.com/yenchenlin/nerf-pytorch 文章目录前言隐式表达NeRF的训练位置编码体渲染&…...

Java之静态代码块和静态类、静态导入
前言 在上一篇文章中给大家讲解了static静态关键字,以及静态变量、静态常量和静态方法等内容。但是关于static,还有其他的一些内容,比如静态类、静态代码块和静态导入等,接下来给大家继续分析讲解。我们一起来看看这些内容都是怎…...

Python3 File isatty() 、os.chflags()方法
Python3 File isatty() 方法Python3 File(文件) 方法概述isatty() 方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False。语法isatty() 方法语法如下:fileObject.isatty(); 参数无返回值如果连接到一个终端设备返回 True&…...

【SH_CO_TMT_PACKAGE保留60天数据和增加索引】
1. 保留60天数据 DELETE FROM SH_CO_TMT_PACKAGE WHERE CREATED_ < SYSDATE - 195SH_CO_TMT_PACKAGE 这个表是tmt的数据统计表,数据量极大,大概有1500W 里头的数据都是从TMT机台运行状况表(比如满管率,断丝数,下次落纱时间)同步过来的。 朗通针对这些数据,做了个…...

2022蓝桥杯省赛——数位排序
问题描述 小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。 例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位之和 13 。 又如, 6 排在 …...

弥散磁共振成像在神经科学中的应用
导读弥散加权成像技术突破了神经科学的界限,使我们能够检查活体人脑的白质微观结构。这为基本的神经科学问题提供了答案,开启了一个以前基本上难以接近的新研究领域。本研究简要总结了神经科学历史上提出的关于大脑白质的关键问题。然后,阐述…...

多进程(python)
参考: https://www.liaoxuefeng.com/wiki/1016959663602400/1017627212385376 个人封装的python多进程处理类,跑满CPU,优化性能 概念 进程: 对于操作系统来说,一个任务就是一个进程(Process),…...

利用Kali工具进行信息收集(35)
预备知识 Kali是一款开源的安全漏洞检测工具,是专业用于渗透测试的Linux操作系统,由BackTrack发展而来,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真…...