Linux 多线程(1)线程概念与线程控制

news2024/11/16 19:54:42

多线程:概念、线程控制(创建、终止、等待、分离),线程安全(问题&实现),应用(生产者与消费者模型,线程池,单例模式)

(重要,因为多线程在实际工作使用较多,所以面试问的多)

1.概念

--线程是进程中的一个执行流程

线程是cpu进行执行调度的基本单元(调度一段代码的执行是通过线程完成的)

--进程是系统进行资源分配的基本单元

Linux下一个进程中是可以存在多个pcb的,一个pcb就是一个执行流程

一个进程中有多个pcb,和多个进程中有多个执行流程使用中有什么区别?

例子:零件加工厂,进行零件加工

多进程:如果有很多的零件加工,就相当于多开几个工厂,多个厂子可以同时加工零件

多线程:如果有很多的零件加工,就在一个 厂子里面,多开几条生产线。

哪个更好?

多进程---多建厂子:资源消耗大,更稳定,健壮

多线程--多开生产线:资源消耗小,健壮性不如多进程

线程到底是什么

线程是cpu调度执行的基本单元,而linux下pcb是程序运行过程的描述,因此linux下的线程通过pcb实现的,学了线程就知道一个进程有多个pcb的。(其他系统下进程有进程的描述,线程有线程的描述 )

因此有些人说linux下没有真正的线程,因为linux下的线程是一个pcb,被称为轻量级进程-LWP

多进程:占用资源多,但是健壮稳定

多线程:占用资源少,但是健壮性低,写代码需要小心

进程与线程的区别

进程是系统进行资源分配的基本单元(每运行一个程序,操作系统就要分配一次程序运行所需的资源)

线程是cpu进行执行调度的基本单元,在linux下是通过pcb实现的,一个进程中可以有多个pcb,被称作轻量级进程 LWP

多线程和多进程在多任务中处理中的优缺点:

多进程:健壮,稳定

多线程:

1.共享了虚拟地址空间,因此线程间通信更加灵活(包括进程间通信在内,还有全局变量,函数传参)

2.创建和销毁成本更低(线程之间很多资源都是共享的,创建一个线程不需要分配太多资源)

3.同进程的线程间调度成本更低(CPU上加载的块表信息,页表指针...不需要替换)

适用场景

对于程序的安全性要求大于性能和资源要求,使用多进程(比如shell);其他使用多线程

多个线程在同一进程中同时运行为什么不会混乱?

  1. 其实每个线程调度执行的就是一个函数

vfork--创建子进程,父子进程公用同一个虚拟地址空间,为了避免出现运行混乱,因此父进程阻塞直到子进程程序替换或者退出

  1. 多线程关于栈执行出现混乱的解决方案:把所有可能混乱的地方,给每个线程都单独整一份

线程之间的独有信息:标识符、栈、上下文数据、信号屏蔽字

给一个进程发送一个信号,进程中有多个线程(pcb),谁处理这个信号?--谁有时间谁就去(谁拿到时间片正在运行就是谁)

线程之间的共享信息:虚拟地址空间、文件描述符、信号处理方式、工作路径、用户ID、组ID

2.多任务处理

在多任务处理中,使用多执行流完成的优点:更加充分利用计算机资源,提高任务处理效率

那么在多任务处理中启动多少执行流比较合适呢?

执行流不是越多越好:因为执行流越多,cpu切换调度越频繁,执行流太多,返回会造成切换调度消耗大部分资源,启动多少执行流没什么固定数量,压力测试即可,不同程序对CPU要求不一样。

在任务处理中,程序分为两种程序:

  1. cpu密集型程序:一段数据中几乎都是数据的运算(对CPU使用率高)

  1. IO密集型程序:一段程序中大部分都是IO操作(大部分时间都是进行IO操作或者等待,对CPU使用率不高)

3.线程控制

主要为线程操作接口(创建、终止、等待、分离)

liunx下线程操作接口都是库函数,因为linux操作系统并没有直接向上层提供线程的系统掉用接口,直接基于系统的调用接口封装实现线程的相关接口。

线程库

与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的

要使用这些函数库,要通过引入头文<pthread.h>

链接这些线程函数库时要使用编译器命令的“-lpthread”选项

创建

int pthread_create(pthread_t *tid, pthread_attr_t *attr, void *(routine)(void*), void *arg);

tid:传入一个pthread_t类型变量的空间地址。用于接收线程ID--线程的操作句柄

attr:设置线程的属性,大部分属性都不用管;后面会有一个分离属性使用单独接口进行设置,attr为NULL表示使用默认属性

routine:是个函数指针,传入线程入口函数的地址,这个线程调度运行的就是这个函数

arg:给线程启动函数routine传入的参数

功能-----创建一个线程,指定这个线程要运行的函数routine,并给这个函数传入一个数据arg

返回值:成功返回0;失败返回错误码(非0)

注意:线程被创建出来后,谁先运行不一定 ,取决于操作系统的调度

线程只是一个执行流,说白了就是一个机器人,他做什么,什么时候 做,都是程序员来指定的

函数是一段功能的集合

线程是个执行流,线程是调度一个函数运行的

线程信息的查看

ps-L 选项进行查看(查看到其实是轻量级进程信息)

在多线程程序中,一个进程里面有多个pcb,当ps查看进程信息的时候应该显示谁的?

一个进程运行起来,默认会创建一个线程(pcb),这个线程有自己的pid

如果下边通过pthread_create创建一个线程(pcb),这个线程也有自己的pid,真正使用p查看进程信息的时候查看的是主线程pcb对应的信息

终止

线程终止:如何退出一个线程的运行

线程其实调度运行的是创建时所传入的入口函数,因此其实线程入口函数运行完了,线程就退出了

  1. 在线程入口函数中return;

注意:main中return退出的不仅是主线程,而是整个进程

  1. 在任意位置调用接口: void *pthread_exit(void *retval);

retval:用于设置线程的退出返回值

(上面两种方式都是主动退出,谁调用,谁退出)

  1. 在任意位置调用接口: int pthread_cancel(pthread_t tid);

注意:这个接口用来取消指定线程运行的,给谁tid,推出谁

一个线程如果是被取消的,则他的返回值就不是一个正经的返回值 了

等待

  1. 主线程退出,其实不影响其他线程的运行(不多见)

所有的线程退出了,则进程退出释放所有资源;(所有生产线停了,厂子没必要存在)

进程退出了,会先退出所有的线程;(一个厂子塌了,所有生产线也都坏了)

  1. 其实一个线程退出了,资源也并没有完全释放(因为要保存返回值)

僵尸进程:子进程退出了,为了获取退出码,因此没有直接释放资源,等待父进程处理

等待:等待指定的线程退出,获取退出线程的返回值,回收退出线程的所有资源

线程之间传递数据要尤其注意数据的生命周期

如果一个线程是被取消的,则获取的返回值是PTHREAD_CANCELED 本质是个 (void*)-1

分离

在线程属性中,有一个分离属性,默认值是joinable,表示线程退出后,不会自动释放资源,需要被其他线程等待。

但是我们并不关心一个线程的返回值,也不想等待他的退出,则这时候将这个分离属性设置为detach状态;

detach状态,表示线程退出后,自动释放所有资源,不需要被等待(资源是自动释放的,因此也不能被等待--等待会出错)

接口: int pthread_detach(pthread_t tid);//设置指定线程的分离属性为detach

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

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

相关文章

linux系统(进程间通信)06_IPC概念,pipe管道,fifo通信,mmap 共享映射区

01 学习目标 1.熟练使用pipe进行父子进程间通信 2.熟练使用pipe进行兄弟进程间通信 3.熟练使用fifo进行无血缘关系的进程间通信 4.熟练掌握mmap函数的使用 5.掌握mmap创建匿名映射区的方法 6.使用mmap进行有血缘关系的进程间通信 7.使用mmap进行无血缘关系的进程间通信 02 IPC概…

Netfilter和iptables命令详解,从入门到精通

本文目录 1、netfilter架构和工作原则简介2、iptables操作命令说明2.1 、Filtering Specifications2.2、Target Specifications2.3、一个基于Linux的基本的防火墙的配置例子 netfilter 是Linux内核里网络部分的一个重要框架&#xff0c;内核通过netfilter完成IP报文的一些操作。…

缓存雪崩问题

缓存雪崩&#xff1a;指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量的请求到达数据库&#xff0c;带来巨大的压力 解决方案&#xff1a; 1.给不同的key的TTL添加随机值 2.利用redis集群提高服务的可用性 3.给缓存业务添加降级限流策略 4.给业务添…

扫雷,咱就是一扫一大片(C语言完美递归版)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以…

零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑

我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来&#xff0c;而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后&#xff0c;我感觉自己脱胎换骨&#xff0c;给自己贴上了「会画画」的新标签。 丁老头进化旅程 Stable Diffusion 是一个「文本到图像」的…

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 进阶版 基础版 基本介绍 MATLAB实现QRLSTM长短期记忆神经…

微波方向有哪些SCI期刊推荐? - 易智编译EaseEditing

微波方向的SCI期刊推荐包括&#xff1a; IEEE Transactions on Microwave Theory and Technology&#xff1a; 该期刊是电磁场与微波技术领域的著名期刊&#xff0c;被世界上许多研究机构和大学广泛引用。 IEEE Transactions on Antennas and Propagation&#xff1a; 该期刊…

C++学习记录——이십일 AVL树

文章目录 1、了解AVL树2、模拟实现3、旋转1、左单旋2、右单旋3、双旋&#xff08;先左后右&#xff09;4、双旋&#xff08;先右后左&#xff09; 4、检查平衡5、测试性能&#xff08;随机数&#xff09;6、删除 1、了解AVL树 如果数据有序或接近有序&#xff0c;二叉搜索树将…

Java+Python+Paddle提取长文本文章中词频,用于Echart词云图数据

公司有个需求&#xff0c;就是需要提供给echart词云图的数据&#xff0c;放在以前我们的数据来源都是从产品那直接要&#xff0c;产品也是跑的别的接口&#xff0c;那怎么行呢&#xff0c;当然有自己的一套可以随便搞了&#xff0c;那么操作来了 Java package cn.iocoder.yud…

推荐几款2023年还在用的IDE工具

近期有不少刚学编程的小伙伴来问我&#xff0c;市面上那么多IDE工具&#xff0c;该怎么选&#xff1f;今天在这里跟大家分享几款个人比较钟爱的IDE工具&#xff0c;供大家参考。 Visual Studio 优点&#xff1a;支持多种语言&#xff0c;包括C#, C, Visual Basic等&#xff0c…

【Linux】进程信号“疑问?坤叫算信号吗?“

鸡叫当然也算信号啦~ 文章目录 前言一、认识信号量二、信号的产生 1.调用系统函数向进程发信号2.由软件条件产生信号3.硬件异常产生信号总结 前言 信号在我们生活中很常见&#xff0c;下面我们举一举生活中信号的例子&#xff1a; 你在网上买了很多件商品&#xff0c;再等待不…

【跟着陈七一起学C语言】今天总结:函数、数组、指针之间的关系

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

深度学习实战29-AIGC项目:利用GPT-2(CPU环境)进行文本续写与生成歌词任务

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习实战29-AIGC项目&#xff1a;利用GPT-2(CPU环境)进行文本续写与生成歌词任务。在大家没有GPU算力的情况&#xff0c;大模型可能玩不动&#xff0c;推理速度慢&#xff0c;那么我们怎么才能跑去生成式的模型…

14 KVM虚拟机配置-配置虚拟设备(其它常用设备)

文章目录 14 KVM虚拟机配置-配置虚拟设备&#xff08;其它常用设备&#xff09;14.1 概述14.2 元素介绍14.3 配置示例 14 KVM虚拟机配置-配置虚拟设备&#xff08;其它常用设备&#xff09; 14.1 概述 除存储设备、网络设备外&#xff0c;XML配置文件中还需要指定一些其他外部…

Python+selenium,轻松搭建 Web 自动化测试框架

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…

云渲染靠谱吗,使用云渲染会不会被盗作品?

云渲染靠谱吗、安全吗&#xff1f;如果使用 云渲染会不会被盗作品......Renderbus瑞云渲染作为一个正经的云渲染平台&#xff0c;也时不时会收到这类疑问&#xff0c;首先&#xff0c;瑞云渲染是肯定靠谱的,各位可以放心使用。另外小编也将在本篇教你如何辨别云渲染平台是否安全…

通达信W底形态选股公式,也称双底形态

W底形态&#xff0c;也称双底形态&#xff0c;是一种经典的技术分析形态&#xff0c;代表了跌势的逆转。看起来像字母 "W"&#xff0c;描述了一波下跌&#xff0c;反弹&#xff0c;再次下跌到与上一波下跌相同或相近的位置&#xff0c;最后是另一波反弹。W底形态两次…

【细读Spring Boot源码】@ComponentScan是如何生效的?

前言 在使用SpringBoot使用过程中 RestController、Service、Repository这几个注解类上都标有Component注解 启动类上标有的SpringBootApplication注解类上有个ComponentScan注解。那么ComponentScan如何把相关的对象注册到BeanFactory的&#xff1f; 找到处理ComponentScan注…

【Qt 从入门到入土】下篇

【Qt 从入门到入土】上篇 一个非常好的学习 Qt 的视频 本文目录 6. 对话框QDialog6.1 基本概念6.2 标准对话框6.3 自定义消息框6.4 消息对话框6.5 标准文件对话框 7. 布局管理器7.1 系统提供的布局控件7.2 利用widget做布局 8. 常用控件8.1 QLabel 控件使用8.2 QLineEdit8.3 其…

1_5 pytorch操作

一、torch 算子 1、torch.nn.functional.affine_grid(theta, size) 给定一组仿射矩阵(theta)&#xff0c;生成一个2d的采样位置(流场)&#xff0c;通常与 grid_sample() 结合使用,用于空间仿射变换网络&#xff0c;用于对2D或3D数据进行仿射变换。 输入&#xff1a;theta(Te…