网络通信-线程管理

news/2024/4/25 22:22:49/文章来源:https://blog.csdn.net/weixin_56262931/article/details/127252442

线程管理

一、基本概念

    1、线程是进程的执行路线,它是进程内部的控制序列,或者说线程是进程的一部分(进程是一个资源单位,线程是执行单位,线程是进程的一部分,负责真正的执行)

    2、线程是轻量级的,没有自己独立的代码段、数据段、bss段、堆、环境变量、命令行参数、文件描述符、信号处理函数、当前目录信息等资源

    3、线程有自己独立的栈内存、线程ID、错误码、信号屏蔽掩码

    4、一个进程中可以包含多个线程(多个执行路线),但是至少有一个线程在活动,称为主线程

    5、ps -T -p <pid> 查看pid进程中的线程情况 或者htop命令也可以查看

    6、线程是进程的实体,可以当做系统独立的任务调度和分配的基本单位

    7、线程有不同的状态、属性,系统提供了线程的控制接口,例如:创建、销毁、控制

    8、进程中的所有线程同在一个虚拟地址空间中,进程中的所有资源对于线程而言都是共享的,因此当多个线程协同工作时需要解决资源竞争问题(加锁)

    9、线程的系统开销很小、任务切换快,多个线程之间不需要数据交换、因此不需要类似于XSI的通信机制,因此使用线程简单而高效

    10、线程之间有优先级的差异

二、POSIX线程

    1、早期的UNIX和Linux系统没有线程概念,微软的Windows系统首先使用的线程,之后UNIX和Linux系统也逐渐增加了线程

    2、早期各个厂商有自己私有的线程库,而且接口的实现差异较大,不利于移植,世界标准化组织与1995年,制定了统一的线程接口标准规范,遵循该标准的线程称为POSIX线程,简称pthread

    3、pthread线程包含一个头文件 <pthread.h> 和一个共享库libpthread.so

        -pthread

三、线程管理

    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

    功能:创建新线程

    thread:输出型参数,用于获取线程ID

    attr:用于设置线程属性,一般写NULL即可

    start_routine:线程的入口函数,相当于主线程的main函数

    arg:传递给start_routine入口函数的参数

    返回值:成功返回0,失败返回错误编码

    注意:入口函数的参数。返回值要确保它的可持续性,因此不太适合使用栈内存,可以考虑堆内存、全局变量

    int pthread_join(pthread_t thread, void **retval);

    功能: 等待线程的结束,并获取该线程结束时入口函数的返回值,并释放线程资源

    thread:要等待的线程ID

    retval:用于存储线程结束时返回值的地址,拿到返回值变量本身

    返回值:成功返回0,失败返回错误编码

    pthread_t pthread_self(void);

    功能:获取当前线程的线程ID

    int pthread_equal(pthread_t t1, pthread_t t2);

    功能:比较两个线程ID是否一致

    返回值:一致返回非零值,不一致返回0

    注意:在个别操作系统下,pthread_t 是以结构实现的,大部分是以 unsigned long 呈现,为了可移植性,不能直接使用 == 比较

        pthread_t tid;//   不要初始化 提高可移植性

四、线程的执行轨迹

    同步方式:默认 (可结合状态)

        创建子线程后,主线程通过调用pthread_join函数等待子线程终止,并释放线程资源

    异步方式:(分离状态)

        无需创建等待(如果创建者调用pthread_join函数会立即返回),线程结束时由系统释放资源

    原因:为了避免线程资源泄漏,每个可结合状态的线程必须显示地调用pthread_join来回收资源或者将其变成分离状态

    int pthread_detach(pthread_t thread);

    功能:让已创建的thread标识的线程与创建者线程分离

    pthread_detach两种用法:

        1、主线程中调用 pthread_detach(tid)

        2、新线程中调用 pthread_detach(pthread_self())

        注意:无论哪种分离写法,都必须发生在pthread_join之前,否则join一旦进入等待,再分离也不会退出等待

五、线程的终止

    1、线程执行了入口函数的最后一行代码 包括return语句

    2、线程执行了pthread_exit函数

        void pthread_exit(void *retval);

        功能:结束当前线程

        retval:等同于return 后面的val

       

        注意:从表面上看当主线程结束后,子线程会跟着一起结束,就会误以为主线程的结束影响了子线程的结束,但是实际上子线程之所以结束是因为主线程执行了main函数中隐藏的return语句,

        导致了整个进程结束,所以进程中所有的线程才会随之结束。

        如果主线程调用pthread_exit自杀,这样就没有线程取执行main函数的return语句,进程就不会提前结束,子线程就不受影响了

        总结:主线程结束不会影响子线程的执行

    3、如果所在的进程结束,所有的线程都随之结束

    4、向指定线程发送取消请求

        int pthread_cancel(pthread_t thread);

        功能:向指定线程发送取消请求,默认情况下会响应请求

        int pthread_setcancelstate(int state, int *oldstate);

        功能:设置本线程是否响应取消请求,并获取之前的状态

            PTHREAD_CANCEL_ENABLE   允许响应

            PTHREAD_CANCEL_DISABLE  禁止响应

       

        int pthread_setcanceltype(int type, int *oldtype);

        功能:设置延迟响应

        PTHREAD_CANCEL_DEFERRED     延迟响应 在接收到取消请求后不立即响应,而是等待合适的时间再响应

        PTHREAD_CANCEL_ASYNCHRONOUS 立即响应

六、线程属性

    pthread_attr_t

    typedef struct

    {

        int                       detachstate;     线程的分离状态

        int                       schedpolicy;     线程调度策略         先进先出 轮询

        struct sched_param        schedparam;      线程的调度参数

        int                       inheritsched;    线程的继承性

        int                       scope;           线程的作用域

        size_t                    guardsize;       线程栈末尾的警戒缓冲区大小

        int                       stackaddr_set;   线程栈的设置

        void *                    stackaddr;       线程栈的位置

        size_t                    stacksize;       线程栈的大小

    }pthread_attr_t;

    在/usr/include/i386-linux-gnu/bits/pthreadtypes.h这个文件中找到关于pthread_attr_r的定义,但是该定义不是真的线程属性结构体的定义,真实的定义应该如上所示,

    大概是因为pthread不想让用户看到它对pthread_attr_t的实现,希望用户借助它提供的接口函数进行获取、设置属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_398944.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github每日精选(第52期):验证您的有风险的shell命令shellfirm

shellfirm shellfirm 是一个shell的拦截器&#xff0c;拦截任何有风险的shell命令&#xff08;默认或由您定义&#xff09;并提示您进行双重验证。 我如何从自己身上拯救自己&#xff1f; rm -rf *git reset --hard在按下回车键之前&#xff1f;kubectl delete ns停止&#…

【干货】10个高质量的java自学网站推荐

经常有人留言问我&#xff0c;“想学习Java编程&#xff0c;有没有学习资源推荐&#xff0c;有哪些网站可以关注”。好些同学是去网盘搜索&#xff0c;或者去某宝购买&#xff0c;搜集一堆资料&#xff0c;但是又不清楚哪些是重复的内容&#xff0c;哪些内容是不是版本已经过时…

【Bluetooth|蓝牙开发】十一、一文秒懂 | 超详细的Bluez交叉编译

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;【 所有文章汇总】 1、 前言 前面几篇文章&#xff0c;主要讲解了蓝牙协议栈层面的内容&#xff0c;本篇来从源…

城区导航智能驾驶难在哪?写在小鹏/华为-极狐NOA释放之时

交流群 | 进“传感器群/滑板底盘群”请加微信号&#xff1a;xsh041388交流群 | 进“汽车基础软件群”请加微信号&#xff1a;ckc1087备注信息&#xff1a;群名称 真实姓名、公司、岗位【本文一万字左右&#xff0c;预计阅读时间约20分钟&#xff0c;文中有若干图片/GIF/视频&a…

猿创征文 | 国产数据库之PolarDB-X数据库详解安装和使用

文章目录1、PolarDB-X是什么&#xff1f;2、PolarDB-X架构3、PolarDB-X架构优势4、PolarDB-X核心特性5、PolarDB-X部署5.1、通过PXD部署集群5.2、通过 K8S 部署5.3、通过编译安装1、PolarDB-X是什么&#xff1f; PolarDB-X是由阿里巴巴自主研发的云原生分布式数据库&#xff0…

如何修复u盘?不如试试我这3个方法

u盘小小的一个便于我们携带&#xff0c;里面保存着我们很多数据。但是有时我们不小心清空了里面的数据&#xff0c;或者由于其他原因&#xff0c;导致u盘里的文件丢失&#xff0c;甚至出现打不开的局面。这时候该如何修复u盘&#xff1f;为了解答大家的疑惑&#xff0c;小编专门…

docker搭建主从架构和哨兵模式

下文介绍使用docker来创建redis的主从架构和哨兵模式 前提 linux已经下载并安装了docker 从仓库中pull redis的镜像 docker pull redis:latest确保主机中的镜像已经有了刚下载好的redis镜像 docker images架构图 一. docker创建redis的主从架构 1. 先创建一个master节点…

聚观早报 | 字节2021年亏损6041亿元;iPhone SE 4将采用刘海屏

今日要闻&#xff1a;字节2021年亏损6041亿元&#xff1b;iPhone SE 4或将采用刘海屏&#xff1b;京东众筹10月10日停止运营&#xff1b;特斯拉中国销量再创月度新高&#xff1b;大众将在中国成立软件合资企业字节2021年亏损6041亿元 10 月 10 日消息&#xff0c;字节跳动向员工…

FFmpeg基础:抽取视频文件中的音视频原始数据

文章目录视频流解码音频流解码原始的音视频数据数据量很大&#xff0c;为了方便传输和存储&#xff0c;我们会对原始数据进行压缩和编码。h264是常见的视频编码标准之一&#xff0c;AAC是常见的音频编码标准之一。这里介绍一下如何通过FFmpeg库将视频文件中的h264视频流解码成原…

[Unity] 获取UI组件的屏幕坐标(打包手机端使用前置摄像头)

因为我是打包到手机端&#xff0c;并且使用的是前置摄像头 在Canvas默认的render mode&#xff08;Screen Space - Overlay&#xff09;下&#xff1a; 我想要使用 arcamera.WorldToScreenPoint(button.transform.position) 将Canvas下的button世界坐标转为屏幕坐标&#xff…

手把手教你搭建属于自己的第一个Maven项目并引入Spring容器依赖

前言 最近在学习Maven和Spring&#xff0c;在这里做个学习记录并且分享一些我自己的学习经验&#xff0c;对Maven和Spring感兴趣的小伙伴可以一起来学习&#xff0c;有任何问题也欢迎一起来交流讨论。 Spring简介 Spring框架由Rod Johnson开发&#xff0c;2004年发布了Sprin…

(附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

技术分享预告|DocArray x Redis 比快更快的向量搜索

从国内的学生开发者&#xff0c;到深入参与国际化开源社区。小燕主动出击&#xff0c;不放过任何一个贡献机会。快来看看原子能科学研究院核物理专业小姐姐的神仙输出&#xff01;北京时间 10 月 11 号&#xff0c;本周二晚 10 点&#xff0c;小燕将在 Zoom 平台&#xff0c;面…

第03章 成人感冒不是大事,少往急诊跑

急诊是病菌最多的地方&#xff0c;能避则避我在安贞急诊工作了数个年头&#xff0c;最大的体会就是急诊像个大的农贸市场&#xff0c;每天人头攒动、人山人海、接踵摩肩、座无虚席、门庭若市、沸沸扬扬、热闹非凡、熙熙攘攘、车水马龙、人来人往……写了这么多词汇都不足以写出…

Redis(Jedis入门 Jedis连接池

本章导学&#xff1a; 什么是Jedis&#xff1f;Jedis入门案例 新建项目&#xff0c;导入依赖建立连接进行测试释放资源Jedis的连接池使用一、什么是Jedis Redis不仅是使用命令来操作&#xff0c;现在基本上主流的语言都有客户端支持&#xff0c;比如java、C、C#、C、php、Nod…

Spring IOC核心知识

控制反转&#xff08;IOC: Inversion Of Control&#xff09;&#xff0c;把对象的创建和对象之间的调用过程都交给Spring管理&#xff0c;从而降低耦合度。 IOC底层原理 三大技术&#xff1a;XML解析、工厂模式、反射 IOC创建对象的过程&#xff1a; IOC重要接口 IOC容器底…

路径分析—QGIS+PostgreSQL+PostGIS+pgRouting(一)

前言 因业务需求,需要做最短路径分析。最近几天查询资料,并自己动手,实现了简单的路径分析。 下面就介绍具体的实现过程。 本篇文章最终结果是在 PostgreSQL 数据库中实现的,后续的可视化展示会继续跟进。 一、道路数据处理 如果你已经有了道路数据,那就直接使用。 由于当…

传统应用如何“丝滑”转型为云原生应用?

市场需求瞬息万变&#xff0c;传统型的应用逐渐无法满足业务侧要求&#xff0c;传统应用向云原生应用转型&#xff0c;已势在必行。本篇文章将介绍基于CloudOS&#xff08;一站式云原生开发平台&#xff09;如何实现传统应用向云原生应用的转型。 在此之前&#xff0c;我们需…

python基础(老师PPT)

slist [Alice,2019001, Geoscience, 95] # 使用分号加tab作为分隔符&#xff0c;连接字符串 print(;\t.join(slist))# a X if condition else Z # condition为True时&#xff0c;赋值为X&#xff0c;否则赋值为Z a, b 1, 2 c a > b if a > b else a < b print(c)…