linux学习之线程2:线程控制与使用

铺垫

之前我们提到,Linux不直接对线程进行调度,而是对轻量级进程进行调度。但用户就想像Windows那样直接对线程进程控制。所以,就有了pthread库来封装了一层。

那么想要进行线程控制,要用pthread库。(pthread库是原生线程库,即系统自带的)

原本的线程叫主线程,新创建的叫新线程。

创建线程

pthread_create函数

用于创建新线程来并发执行一个函数

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);pthread_t *thread:指向一个线程标识符 pthread_t 的指针,用于存储新创建的线程的 ID。这个 ID 以后可以用于其他线程操作,如等待线程结束或取消线程。const pthread_attr_t *attr:指向线程属性对象的指针。通过该参数可以设置线程的属性(如是否可被 join、栈大小等)。如果传入 NULL,则使用默认的线程属性。void *(*start_routine)(void *):这是线程要执行的函数的指针。该函数的返回值类型为 void*,参数类型为 void*,即它接受一个通用的指针参数,并返回一个通用指针作为结果。void *arg:传递给 start_routine 函数的参数,它是一个通用指针。可以通过它传递任意类型的数据到线程函数中。

LWP和PID

在这里插入图片描述

我们通过显示线程的详细信息,能看到PID和LWP,
LWP是轻量级进程的ID,实际上我们在调度的时候,使用的都是LWP ID。

getid?

我们用getid()来获得两个线程的id,发现得到的是PID,LWP并没有提供直接获取的方式,比较麻烦。

线程运行与结束顺序

是新线程先运行还是老线程先运行,由调度器决定。
但是当主线程结束之后,进程就会退出,所有线程也就退出了

等待进程

pthread_join 函数

int pthread_join(pthread_t thread, void **retval);pthread_t thread:要等待的线程的标识符,即需要 pthread_join 的线程 ID。这个 ID 是由 pthread_create 创建线程时返回的 pthread_t 类型变量。void **retval:这是一个指向指针的指针,用于存储目标线程的返回值。线程的返回值可以通过 pthread_exit 返回,也可以是线程函数的返回值。如果你不关心返回值,可以传递 NULL

同一进程下的多线程

  1. 同一个进程的线程,资源是共享的
  2. 多线程中,任意一个线程出问题,则进程退出
  3. 并且不用考虑

退出

pthread_exit

用pthread_exit来退出某个进程,谁调用这个函数就退出谁

pthread_cancel

当我们确定这个进程已经启动的时候,我们可以调用pthread_cancel函数,来取消这个线程

线程优点

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

cache

线程切换比进程好的关键原因就是cache
cache就是CPU中的缓存,
他会默认存储正在执行代码的下一行代码的地址,方便执行。
线程切换不会影响缓存(前面提到了:因为同一进程中的线程共享相同的地址空间和全局数据。),而进程切换之后,缓存一般需要重新加载。所以

计算密集型和i/o密集型

计算密集型:解压,压缩之类的,使用cpu的资源。
建议cpu有几核,就创建几个线程,太多线程切换起来还要时间
i/o密集型:下载之类的。
可以多开几个,来减少等待时间。

缺点

健壮性降低
编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
缺乏访问控制
进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响(因为大部分资源是共享的)

线程用途

线程与进程

线程独占(私有)

线程共享进程数据,但也拥有自己的一部分数据:

  • 线程ID
  • 一组寄存器(一组线程执行的硬件上下文数据,每个线程还是单独的执行流)
  • 栈( 临时数据会压入栈,如果不区分就会很混乱)
  • errno
  • 信号屏蔽字
  • 调度优先级

线程共享

各线程还共享以下进程资源和环境:

  • 代码和全局数据
  • 文件描述符表(记录打开文件的个数)
  • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id

在创建新的线程的时候,我们需要为每个线程在堆上开辟一段属于自己的开间,再释放掉。这样就避免

线程的使用

传参和返回值

我们不仅可以给线程传递信息,也可以传递对象来执行某些任务。

cpp11的thread

thread库就是封装了Linux的pthread库

为什么要封装

为了使cpp具有跨平台性(使其在vs下也能跑)

Windows

Windows下不用包含pthread库

其他语言

大部分语言都要用到pthread库

线程分离

当我们不关心新线程的执行信息的时候,我们可以将其设为分离状态。要用到pthread_detach函数

int pthread_detach(pthread_t thread);thread: 这是一个类型为 pthread_t 的线程标识符,表示需要设置为分离状态的线程。如果操作成功,pthread_detach 返回 0。如果失败,返回一个错误码。

注意
分离后的线程不需要join,否则会出错

讨论

那新线程和主线程之间还会相互影响吗,

会的
主线程退出,新线程也会退出,资源依然共享

结论

分离只是一种工作状态,不在意执行结果
底层仍是同一个进程
所以大部分应用软件就是主线程死循环(常驻任务),有新任务的时候,就创建新线程。

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

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

相关文章

Spire.PDF for .NET【文档操作】演示:创比较 PDF 文档

PDF 已成为跨不同平台共享和保存文档的标准格式,在专业和个人环境中都发挥着无处不在的作用。但是,创建高质量的 PDF 文档需要多次检查和修订。在这种情况下,了解如何有效地比较 PDF 文件并找出它们的差异变得至关重要,这使文档编…

《Python编程:从入门到实践》外星人入侵

一、规划 在游戏《外星人入侵》中,玩家控制着一艘最初出现在屏幕底部中央的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击。游戏开始时,一群外星人出现在天空中,他们在屏 幕中向下移动。玩家的任务是射杀这些外星…

潘多拉的盒子还是阿拉丁的神灯:揭示RAG噪声在大语言模型中的作用

一、结论写在前面 论文来自清华大学、北京国家信息科学与技术研究中心 论文标题:Pandora’s Box or Aladdin’s Lamp: A Comprehensive Analysis Revealing the Role of RAG Noise in Large Language Models 论文链接:https://arxiv.org/pdf/2408.135…

【包教包会】CocosCreator3.x拖尾MotionStreak威力加强版(支持3.x、支持原生、可合批)

将去年写的2.x拖尾升级到3.x 完美适配Web、原生平台(其余平台没测过)。 保留原版功能(拖尾会跟随节点位移、缩放、受节点透明度影响,但不会跟随节点旋转) 支持世界坐标 / 本地坐标切换(至于为什么需要这…

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内…

2024年智能录屏解决方案全攻略,从桌面到云端

如果你有过录屏经验那你一定遇到过被限制录制时长或者录制的画面比较模糊之类的情况。这次我我推荐几款免费录屏软件,让我们可以更自由的录制屏幕画面。 1.福晰REC大师 链接:www.foxitsoftware.cn/REC/ 这款软件便捷好操作,而且符合我这次…

post请求中有[]报400异常

序言 在和前端同学联调的时候,发现只要post请求参数里面有[],就会报400的错误 可以看到日志中: The valid characters are defined in RFC 7230 and RFC 3986 解决办法: 参考了博客: spring boot 中解决post请求中有…

辽宁汇聚公益慈善力量,绿葆网络助力辽宁绿色生态建设,彰显企业大爱

9月5日,于辽宁省沈阳市隆重举行的“中华慈善日”主题宣传活动暨“山海有情 天辽地宁”即开型福利彩票发行、“生态公益林”项目启动仪式上,广州绿葆网络发展有限公司作为受邀企业之一,积极履行社会责任,向辽宁省慈善联合总会捐赠了…

Linxu系统:kill命令

1、命令详解: kill命令是用于向进程发送信号,通常用来终止某个指定PID服务进程,kill命令可以发送不同的信号给目标进程,来实现不同的操作,如果不指定信号,默认会发送 TERM 信号(15)&…

[论文笔记]Making Large Language Models A Better Foundation For Dense Retrieval

引言 今天带来北京智源研究院(BAAI)团队带来的一篇关于如何微调LLM变成密集检索器的论文笔记——Making Large Language Models A Better Foundation For Dense Retrieval。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们&quo…

Deploying Spring Boot Apps Tips

Java PaaS providers chatter command Efficient deployments See also spring-boot-reference.pdf https://docs.spring.io/spring-framework/reference/integration/checkpoint-restore.html

【拓扑系列】拓扑排序

【拓扑系列】拓扑排序 前言认识有向无环图认识AOV网:顶点活动图拓扑排序 1. 课程表1.1 题目来源1.2 题目描述1.3 题目解析 2. 课程表 II2.1 题目来源2.2 题目描述2.3 题目解析 3. LCR 114. 火星词典3.1 题目来源3.2 题目描述3.3 题目解析 前言 认识有向无环图 图中…

【局域网投屏】sunshine和moonlight投屏/屏幕共享/扩展屏

主机是sunshine,客机是moonlight,一个太阳一个月光,两者真是太配啦! 下载sunshine sunshine是服务器端,去以下GitHub链接下载windows端的解压缩即用版 https://github.com/LizardByte/Sunshine/releases下载完毕解压…

基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,系统包含GUI操作界面,系统支持对文字,灰度图,彩色图,语音进行加解密。 2.测试软件版本以及…

【银河麒麟高级服务器操作系统】虚拟机服务器执行systemctl提示timeout——分析全过程及处理建议

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 现象描述 产品信息 产品名称 银河麒麟高级服务…

UE5学习笔记21-武器的射击功能

一、创建C类 创建武器子弹的类,创建生产武器子弹的类,创建弹壳的类,生产武器子弹的类的父类是武器的类 创建后如图,ProjectileMyWeapon类(产生子弹的类)继承自weapon类,Projectile(子弹的类),Casing(弹壳声…

第三部分:3---环境变量

目录 什么是环境变量? PATH环境变量: 临时修改环境变量PATH: HOME环境变量: 可能使用环境变量的场景: 进程和环境变量的关系: 环境变量相关操作: 代码获取环境变量: 主函数传…

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

【Unity基础】如何选择Mono的.Net API版本

Edit -> Project Settings -> Player : Api Compatibility Level 在 Unity 的 Project Settings -> Player -> Other Settings 中,API Compatibility Level 设置决定了项目中使用的 .NET API 的兼容级别。Unity 提供了两种主要的 API 兼容级别选项&…