Linux线程:线程控制

news2024/11/18 23:25:58

目录

一、线程的退出与等待

1.1pthread_join线程等待

1.2线程异常

1.3线程如何退出和结束

​编辑 二、线程切换

三、线程的优缺点

3.1优点

3.2缺点

3.3线程vs进程

四、多线程的使用及实操

4.1堆空间共享


一、线程的退出与等待

在Linux中线程具有如下的特点:

1、主线程退出=进程退出=所有线程都要退出。

2、线程也要被"wait",不然会产生和进程类似的问题,造成内存泄露。

3、新线程和主线程的运行先后顺序是不确定的,由调度器来决定。

1.1pthread_join线程等待

int pthread_join(pthread_t thread,void** retval)

 等待一个指定的线程,如果该线程正常退出则返回0,否则返回错误码。如果目标线程没有退出,调用join的线程则会阻塞等待。

而retval实际上是一个输出型参数,用来让调用join的线程拿到目标线程的具体属性和数据。 因为c语言的缘故void类型可以用来接收任意类型,所以我们要想让调用join的线程拿到目标线程的具体信息,目标函数的返回值类型就应当是一个void*类型而retval之所以是void**则是因为我们要手动的创建一个void*的类型来接收和保存目标线程所返回的void*,而要更改void*类型,就需要用到void**。

1.2线程异常

多线程中任何一个线程出现异常都会导致退出则会导致整个进程退出所以多线程的代码往往容易出现健壮性不好的问题。

所以:join不考虑线程异常的情况!因为线程一旦出现异常,整个进程就会跟着退出,join就等待不到目标线程了。

1.3线程如何退出和结束

1、线程函数正常结束,即代码跑完了。

2、不能用exit直接退出,因为exit是用来终止进程的。它会让整个进程直接挂掉。

3、pthread_exit()终止一个线程。

pthread_exit((void*)123);
退出当前线程,退出码123

4、pthread_ cancel()取消一个线程

给指定的线程发送退出信号。

pthread_cancel(tid);//tid为pthread_t类型

而接收到退出信号的线程所返回的退出码就为-1,而-1实际上就是PTHREAD_CANCELED。

 二、线程切换

ls cpu查看CPU中的详细信息。

说到线程切换,其令人首先想要对比的数据就是进程切换,在CPU中存在着大量的寄存器,在进程切换时寄存器中所保存的大量的进程信息以及上下文数据会被加载到正在执行的进程PCB中,然后再将新的进程的上下文数据以及代码等信息加载到CPU中,然后再去执行新的进程,而在Linux操作系统中,线程是由进程进行模拟的在CPU看来线程也是和进程一样的PCB,不过是更加轻量级的进程,而多数人往往存在一个误区,那就是进程间切换和线程间切换所消耗的时间和成本没有区别,因为其二者都是PCB结构,切换时都是进行上下文数据的保存。但着其中存在着一个很大的误区,CPU中除了存在大量的寄存器还存在着一个比寄存器要大的缓存cache,而CPU在执行代码时也并不是傻瓜式的去一行一行拿着虚拟地址通过页表转换到物理内存然后再去执行代码,而是在执行代码时将代码往下的区域一同加载到cache中,这也叫做局部性原理,即使有时会出现跳转到其他代码块的情况,但是从概率上来讲,大概率执行完此行代码会继续往下执行下一行,而同一进程内不同线程之间的代码、数据、地址空间等资源都是共享的,切换线程只需要切换PCB而不需要再像切换进程一样将新进程的代码再次加载进cache中,将cache中的冷数据变成热数据。所以线程切换时相比与进程切换时要付出的成本要小很多。

三、线程的优缺点

3.1优点

1、创建一个新线程的代价要比创建一个新进程小得多。
2、与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多。
3、线程占用的资源要比进程少很多。
4、能充分利用多处理器的可并行数量。
5、在等待慢速I/O操作结束的同时,程序可执行其他的计算任务。
6、计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现。
7、I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

3.2缺点

1、性能损失
一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型 线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的 同步和调度开销,而可用的资源不变。
2、健壮性降低
编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了 不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
3、缺乏访问控制
进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
4、编程难度提高
编写与调试一个多线程程序比单线程程序困难得多

3.3线程vs进程

进程是资源分配的基本单位。
线程是调度的基本单位。
线程共享进程数据,但也拥有自己的一部分数据:
1、线程ID
2、一组寄存器(即每个线程自己的上下文数据)
3、栈(每个线程都有自己独立的栈结构,因为在运行代码时,临时变量等数据都会来回进行压栈出栈,如果多个线程共用一个栈,就会导致数据混乱)。
4、errno
5、信号屏蔽字
6、调度优先级
所以以下两个部分一定是线程所私有的:
1、线程的硬件上下文(CPU寄存器的值)---线程的调度角度
2、线程的独立栈结构---线程的常规运行
进程的多个线程共享 同一地址空间,因此 Text Segment(代码区)、Data Segment(数据区)都是共享的 ,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
1、 文件描述符表(文件描述符表描述的是文件和进程之间的关系)
2、每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
3、当前工作目录
4、用户id和组id
进程和线程的关系如下图 :

 所以:

1、一个线程出问题,导致其他线程出问题,最终导致整个进程退出---线程安全问题。

2、多线程中,公共函数被多个线程同时进入---该函数被重入了。

四、多线程的使用及实操

4.1堆空间共享

如下图代码所示我们边创建线程边让之前创建好的线程去运行:

我们原本的目的是想让1 2 3 4 5这五个线程去不断的打印自己对应的名字,可是运行代码后却出现了如下的问题:

这里就暴露了线程共享数据所导致的问题:

从结果来看貌似只有5号线程在不断的运行其实不然,细看代码可以发现,我们在创建代码进行传参时,传入的是threadname的地址,所以所创建进程拿到的也是threadname的地址,但在main函数中threadname本身是在不断变化的,而创建的新线程和main函数所在的主线程是在同时运行的而每次新线程去调用threadname时都会拿到当前main函数中threadname的值。而跑到最后threadname中就是五号线程的名字,所以导致最后所有线程都在打印五号线程的名字。

所以要想解决这个问题就需要借用堆来解决:

每次给线程创建threadname时都在堆上new一块全新的空间,这样每个线程拿到的都是刚刚才开辟的不同的堆空间。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个人博客网站开发笔记3

文章目录 前言p4 Front Matterp5 配置文件p6 命令p7 部署新的教学视频部署博客到github找视频教程也是一个技能详细步骤安装主题安装渲染器修改主题创建gitub仓库生成密钥验证密钥是否匹配修改config文件推送到github 前言 主要是安装啥的比较费劲 现在已经比较简单了感觉 之…

动手学深度学习23 LeNet

动手学深度学习23 LeNet 1. LeNet2. 代码3. QA 1. LeNet 两层卷积两层池化两层全连接 卷积就是让每一层shape不断压缩变小【高宽减少】,通道数增多,把特征信息放到不同的通道里面。每一个通道认为是一个模式。然后再做全连接的输入。 2. 代码 impor…

面经记录【面试准备】

面经记录【面试准备】 前言版权面经【Java每日一题】Http协议和RPC协议有什么区别?【Java每日一题】什么是微服务,说一下你对微服务的理解Java面试题:应用的线程数应该设置成多少【Java面试】说一下HashMap的put方法字节二面:MySQ…

打印机里失败的任务删不掉的解决办法 斑马打印机更新电脑驱动和升级打印机固件 提示ribbon out 并黄状态亮+黄供应闪

强删打印任务 WinR services.msc 停止服务 Print spooler C:\Windows\System32\spool\PRINTERS 清空文件夹下所有文件 详细 要删除打印机里失败的任务,可以按照以下步骤操作: 停止打印服务:您需要停止Windows系统中的“Print Spooler”服…

【WEEK13】 【DAY4】Shiro Part 4【English Version】

2024.5.23 Thursday Continued from 【WEEK13】 【DAY3】Shiro Part 3【English Version】 Contents 15.6. Integrate Shiro with MyBatis15.6.1. Modify pom.xml15.6.2. Create application.yaml15.6.3. Connect to the database15.6.4. Modify application.properties15.6.5.…

集合的交集、并集和差集运算

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 集合最常用的操作就是进行交集、并集、差集和对称差集运算。进行交集运算时使用“&”符号,进行并集运算时使用“|”符号&…

redis--哨兵

概念 哨兵(Sentinel) 是一个分布式系统,可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossip protocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以…

力扣:15. 三数之和

15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三…

OpenHarmony迎来首个互联网技术统一标准,鸿蒙OS生态走向如何?

开源三年半,OpenHarmony(以下简称“开源鸿蒙”)迎来了新进展。在5月25日召开的「OpenHarmony开发者大会」上,鸿蒙官宣了开源鸿蒙设备统一互联技术标准。 一直以来,各行业品牌操作系统相互独立、难以协同,成为其互联互通的痛点。为进一步解决…

【官方指南】3ds Max中纹理贴图问题及正确解决方案

在使用3ds Max进行设计和制作时,纹理贴图是一个非常重要的环节。然而,许多用户在使用过程中常会遇到各种纹理贴图问题。为此,Autodesk官方提供了一些有效的解决方案,可以解决90%的纹理贴图难题。这里小编都帮大家整理好了&#xf…

剪画小程序:”霸屏各大平台“的黏土滤镜是怎么制作的呢?

最近,网上出现大量“黏土”风格的人物照片。尤其是在社交平台,这类型的分享数量急剧上升。 这是马斯克开车的样子 还有这张是周杰伦七里香的专辑图片 一张照片,十几秒钟,就能还原出你在黏土世界的样子。 以上这些照片是用-【剪画…

基于微信小程序实现的【二手物品交易平台】后端 JAVA Springboot (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称: 基于微信小程序的二手物品交易平台 项目技术栈 该项目采用了以下核心技术栈: 后端框架/库: Java, SSM框架数据库: MySQL前端技术: 微信小程序技术其他相关技术: HTML, MyEclipse开发…

Ant Design Vue Pro流程分析记录

一、基本介绍 Ant Design Vue Pro提供了一套完整的解决方案,包括路由、状态管理、UI组件库、HTTP请求封装等,方便开发者快速搭建和维护企业级应用。 二、官网地址 Ant Design Pro of Vue 三、下载及安装 推荐使用Yarn 四、文件分布及说明 dist&#xf…

文件上传巩固及流量分析

1.[GXYCTF2019]BabyUpload 1)打开题目也是没有任何提示, 2)进入环境,看到下面页面猜测是文件上传漏洞,下面开始传文件 3)首先上传一句话木马 a.php,代码如下: 下面这个代码中并没有…

pinia持久化未生效

pinia官方文档 https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/ pinia持久化未生效的原因很有可能就是在main.js中重复创建了pinia,导致持久化未生效

基于jeecgboot-vue3的Flowable增加表单功能(一)

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 1、通过online表单设计进行,生成代码 主要注意2点,1个是查询需要选择哪些字段,同时创建人员需要选择用户选择 这里,SysForm增加下面的一个注…

反射、类加载、静态代理,jdk动态代理,cglib代理

一、 反射 反射是在程序运行状态下,动态获取类的结构(属性,构造器,方法,注解),动态的创建类对象然后调用类中的属性方法。反射的起源Class,Class中包含类反射要使用的API 获取Class的…

AI 前沿发展摘要

🔔 AI 前沿发展摘要 1⃣️ ChatScene: 一句话生成自动驾驶关键场景 主要功能: Chat Scene 能够在CARLA仿真环境中创建多样化和复杂的场景, 有效地弥合了交通场景文本描述和CARLA实际仿真之间的鸿沟 效果: 通过使用生成的安全关键场景来微调不同的基于RL的自动驾…

艾体宝干货 | 教程:使用ntopng和nProbe监控网络流量

本教程旨在分享如何通过 ntopng 和 nProbe 这两款工具,深入了解和掌握网络流量监控的艺术。我们将提供从基本概念到高级应用的全面指导,涵盖了在多种平台和设备上的部署和配置步骤。不论您是专业人员还是技术爱好者,跟随本教程,都…

『香橙派』基于Orange Pi AIpro打造高效个人云存储解决方案

📣读完这篇文章里你能收获到 了解Orange Pi AIpro硬件优势,为构建高效云存储基础设施的理想平台。学会使用Orange Pi AIpro硬件平台,搭载Ubuntu Server系统,打造云存储环境。掌握利用Kodbox软件,享受文件管理、多格式…