Linux线程:线程控制

目录

一、线程的退出与等待

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.mzph.cn/diannao/17219.shtml

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

相关文章

postman教程-4-发送post请求

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了postman发送get请求的方法,本小节我们讲解一下postman发送post请求的方法。 POST请求通常用于向服务器提交数据以创建新资源或执行某些操作。与GET请求不同,POST请求可…

景源畅信电商:做抖店的成本高吗?

在当今数字化时代,抖音不仅仅是一个分享短视频的平台,更是一个充满商机的市场。随着抖音用户量的激增,越来越多的商家和个人开始关注在抖音上开设店铺,即所谓的“抖店”。那么,做抖店的成本高吗?这个问题困扰着许多初…

【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模型区别,哪个更好?

Kannala-Brandt模型和Scaramuzza多项式模型在描述鱼眼相机畸变时都有其特定的数学表示和应用,但它们之间存在一些区别。以下是对两者区别的分点表示和归纳: 数学表示: Kannala-Brandt模型:它假设图像光心到投影点的距离和角度的多…

Autodl如何进行实例使用(同区)

一、首先找到之前保存的实例 二、点击更多然后选择克隆实例 三、选择是否要保存之前的数据盘 四、选择空余的GPU进行创建即可

【Redis】持久化操作详解

Redis 持久化操作详解 Redis 实现持久化的时候,具体是按照什么样的策略来实现的呢? Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种&…

springcloud 之 Ribbon Hystrix Feign bus 动态修改配置

Ribbon 是微服务架构图中负责负载均衡的 组件。 BeanLoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}测试如下: //微服务方式 Ribbon方式GetMapping("ribbon/{name}")public String RibbonTest(PathVariable String nam…

大模型所谓的参数是什么?大模型为什么需要训练?大模型训练到底干了什么?

“ 大模型的本质是机器学习,机器学习的本质就是一种数学模型。” 我们经常能听到这样的说法,某某大模型有多少参数,某某大模型参数量又提升了,这里所说的参数到底是什么? 我们知道大模型是训练出来的,那么…

中小学校活动怎样投稿给媒体报道宣传?

身为一名学校老师,同时承担起单位活动向媒体投稿的宣传重任,我深知每一次校园活动背后的故事,都承载着师生们的辛勤汗水与教育的无限可能。起初,我满怀着对教育的热情,希望通过文字传递校园的温暖与光芒,却在投稿的道路上遇到了前所未有的挑战。 最初,我选择了最传统的路径——…

【RSGIS数据资源】中国多时期土地利用遥感监测数据集(CNLUCC)

文章目录 数据基本信息摘要数据说明数据引用方式 数据基本信息 数据时间: 多时期(1970年代末期以来11期) 空间位置: 中国 数据格式: 矢量与栅格 空间分辨率: 30m 主题分类: 中国土地利用遥感监测数据 DOI标识&#xf…

UNION的使用

UNION的使用 给出将多条查询语句组合成单个结果集,两个表对应的列数和数据类型必须相同 UNION操作符: 返回两个查询结果集的并集,并去除重复记录 UNION ALL操作符 返回两个查询的结果集的并集。不去掉两个结果集的重复部分,重…

存储方式 - 前端学习

1. cookie是什么?你了解cookie吗? 在计算机领域中,特指一种由服务器发送到用户浏览器并保存在用户计算机上的小型文本文件。这个文件可以被服务器用来识别用户身份、跟踪用户活动、保存用户设置等。它通常由名称、值、域名、路径、过期时间等…

【漏洞复现】号卡极团分销管理系统 ue_serve.php 任意文件上传漏洞

0x01 产品简介 号卡极团分销 管理系统,同步对接多平台,同步订单信息,支持敢探号一键上架,首页多套U|商品下单页多套模板,订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定,内置敢探号、172平台…

CLIP源码详解:clip.py 文件

前言 这是关于 CLIP 源码中的 clip.py 文件中的代码带注释版本。 clip.py 文件的作用:封装了 clip 项目的相关 API,通过这些 API ,我们可以轻松使用 CLIP 项目预训练好的模型进行自己项目的应用。 另外不太容易懂的地方都使用了二级标题强…

【机器学习300问】101、1x1卷积有什么作用?

卷积神经网络最重要的操作就是卷积层的卷积操作,之前文章中介绍过,卷积核filter往往都是3x3或者5x5什么的,但有一种非常特殊的卷积——1x1卷积。他在CNN中扮演着非常重要的角色。 一、通道维度的降维/升维 这是1x1卷积最显著的作用之一。通过…

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型! 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文介绍了 IP-Adapter,一种 高效地将预训练的图像到图像转换模型适应到新领域 的方法。它通过在预训练模型的 输入端 添加一个…

如果任务过多,队列积压怎么处理?

如果任务过多,队列积压怎么处理? 1、内存队列满了应该怎么办2、问题要治本——发短信导致吞吐量降低的问题不能忽略!!3、多路复用IO模型的核心组件简介1、内存队列满了应该怎么办 如图: 大家可以看到,虽然现在发短信和广告投递,彼此之间的执行效率不受彼此影响,但是请…

SpringBoot 上传文件示例

示例效果&#xff1a; 前端代码&#xff1a; <html> <head><title>上传文件示例</title></head> <body> <h2>方式一&#xff1a;普通表单上传</h2> <form action"/admin/upload" method"post" enctyp…

【Android14 ShellTransitions】(五)启动Transition

这一节的内容涉及WMCore以及WMShell&#xff0c;主要是启动Transition。 回到ActivityStarter.startActivityUnchecked方法&#xff1a; 看下最后启动Transition的部分&#xff0c;在ActivityStarter.handleStartResult中&#xff1a; 只关注我们要关注的部分。 首先是如果这…

网络原理-HTTP协议

HTTP协议 HTTP协议全称为超文本传输协议,除了能传输字符串,还能传输图片、视频、音频等。 当我们在访问网页的时候,浏览器会从服务器上下载数据,这些数据都会放在HTTP响应中,然后浏览器再根据这个HTTP响应显示出网页信息。 抓包 抓包工具本质上是一个代理工具,即我们将构造…

STM32H743+USBHID+CubeMX配置

一、环境准备 电脑系统&#xff1a;Windows 10 专业版 20H2 IDE&#xff1a;Keil v5.35、STM32CubeMX v6.5.0 测试硬件&#xff1a;正点原子阿波罗STM32H743 二、测试步骤 1、使用用例工程 配置STM32H743定时器功能-CSDN博客https://blog.csdn.net/horse_2007s/article/d…