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

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

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

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

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

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

相关文章

6个月的测试,来面试居然要15K,我一问连5K都不值

2023年4月份我入职了深圳某家创业公司&#xff0c;刚入职还是很兴奋的&#xff0c;到公司一看我傻了&#xff0c;公司除了我一个自动化测试&#xff0c;公司的测试人员就只有2个开发3个前端1个测试还有2个UI&#xff0c;在粗略了解公司的业务后才发现是一个从零开始的项目&…

Java版本-招投标采购系统源代码-高效管控招采流程-降低采购成本

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

计算机网络面试题(上)

1.TCP/IP 网络模型有哪几层&#xff1f; TCP/IP 网络通常是由上到下分成 4 层&#xff0c;分别是应用层&#xff0c;传输层&#xff0c;网络层和网络接口层。 每一层的封装格式&#xff1a; 网络接口层的传输单位是帧&#xff08;frame&#xff09;&#xff0c;IP 层的传输单位…

构造函数的复习,析构函数,拷贝构造函数与由此关于引用的思考

TIPS 在类当中不受访问限定符的限制&#xff0c;在类外面才会受到限制由于内存栈区的使用习惯是先使用高地址&#xff0c;再使用低地址&#xff1b;因此比方说有两个实例化对象依次创建&#xff0c;并且这两个实例化对象当中都有析构函数&#xff0c;也就是当退出销毁的时候&a…

CompletableFutrue异步处理

异步处理 一、线程的实现方式 1. 线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{Overridepublic void run() {System.out.println("当前线程:" Thread.currentThread().getName());} }1.2 实现Runnable接口 class ThreadDemo02 implements …

UDP协议介绍

文章目录 一、端口号二、UDP协议1.UDP协议格式2.UDP协议的特点3.UDP缓冲区 三、UDP注意事项 一、端口号 端口号是在网络中标识一台主机上进行通信程序的唯一性的&#xff0c;在TCP/IP协议中&#xff0c;用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个…

[工具]Pytorch-lightning的使用

Pytorch-lightning的使用 Pytorch-lightning介绍Pytorch-lightning与Pytorch的区别Pytorch-lightning框架的优势Pytorch-lightning框架 重要资源 Pytorch-lightning介绍 这里介绍Pytorch_lighting框架. Pytorch-lightning与Pytorch的区别 Pytorch-lightning可以简单的看作是…

计算机图形学 | 实验六:旋转立方体

计算机图形学 | 实验六&#xff1a;旋转立方体 计算机图形学 | 实验六&#xff1a;旋转立方体Z-缓冲GLM函数库PVM矩阵PVM矩阵的使用 华中科技大学《计算机图形学》课程 MOOC地址&#xff1a;计算机图形学&#xff08;HUST&#xff09; 计算机图形学 | 实验六&#xff1a;旋转…

携创教育:自考、成考、开放大学几年能够毕业拿证?

目前&#xff0c;国家承认的成人学历提升的形式只有3种&#xff0c;分别是自考&#xff0c;成考&#xff0c;开放大学。 ▼各学历形式拿证时间▼ ★自学考试 自考没有入学考试&#xff0c;只需要参加相应的课程考试&#xff0c;所有课程考试合格后&#xff0c;符合毕业条件即可…

【Linux】usb游戏手柄测试、编程

1、简述 在ubuntu18.04下使用usb游戏手柄,之前联系客服,客服回答不清楚是否支持linux,因此采购一款北通蝙蝠2的手柄来测试 2、测试 2.1 测试环境 系统:Ubuntu18.04 正常电脑系统ubuntu中都是自带手柄驱动的joystick,即内核配置已添加选项:Joysticks interface和Joys…

制作帮助中心过程中常见的误区与解决方法?

制作帮助中心是为了帮助用户了解产品和解决问题的重要手段。然而&#xff0c;在制作的过程中&#xff0c;我们可能会遇到一些误区&#xff0c;这些误区可能会导致我们的帮助中心无法达到预期的效果。因此&#xff0c;在本文中&#xff0c;我们将探讨制作帮助中心过程中常见的误…

try(){}用法try-with-resources、try-catch-finally

属于Java7的新特性。 经常会用try-catch来捕获有可能抛出异常的代码。如果其中还涉及到资源的使用的话&#xff0c;最后在finally块中显示的释放掉有可能被占用的资源。 但是如果资源类已经实现了AutoCloseable这个接口的话&#xff0c;可以在try()括号中可以写操作资源的语句(…

Oracle SQL优化相关数据项

要掌握SQL调优技术,就需要能读懂SQL语句的执行计划,要想读懂SQL语句的执行计划,不仅需要准确理解SQL语句执行计划中各操作及其含义,还需要准确理解SQL语句执行计划中各数据项的含义。本书第7章中,已经对SQL语句执行计划中各个操作的含义做了详尽的阐述,本章中,我们将对S…

(4)Qt——基本组件

目录 1. Designer 设计师** 2. Layout 布局*** 3. 基本组件 3.1 QWidget** 3.2 ui指针 3.3 QLabel 标签** 3.4 QAbstractButton 按钮类** 3.5 QLineEdit 单行文本输入框** 3.6 QComboBox 组合框** 3.7 一组与数值相关的组件* 1. Designer 设计师** Designer是一款独立的用于设计…

ShardingSphere系列四(Sharding-JDBC内核原理及核心源码解析)

文章目录 1. ShardingSphere内核解析1.1 解析引擎1.2 路由引擎1.3 改写引擎1.4 执行引擎1.5 归并引擎 2. ShardingSphere的SPI扩展点2.1 SPI机制2.2 ShardingSphere中的SPI扩展点2.3 实现自定义主键生成策略 3. ShardingSphere源码 1. ShardingSphere内核解析 ShardingSphere虽…

SuperMap GIS基础产品桌面GIS FAQ集锦(2)

SuperMap GIS基础产品桌面GIS FAQ集锦&#xff08;2&#xff09; 【iDesktop】【10.2.1】【11.0.1】 请问在 iDesktop 桌面端对线数据集进行打断线操作后&#xff0c;打断的线不显示是什么原因呢&#xff1f; 【问题原因】 当时操作的线数据集空间索引存在异常&#xff0c;导致…

PostgreSQL 新闻速递 谷歌基于POSTGRESQL 兼容数据库提供更大规模的数据库服务

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

初级算法-贪心算法

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-贪心算法 一、分发饼干二、摆动序列三、最大子序和四、买卖股票最佳时机五、跳跃游戏六、跳跃游戏二七、k次取反后最大化的数组和八、加油站九、分发糖果十、柠檬水找零十一、根据身高重建…

David Silver Lecture 4: Model-Free Prediction

1 Introduction 任务&#xff1a;第三章使用动态规划方法&#xff0c;解决known的MDP问题&#xff0c;这章通过model free prediction对一个unknown的MDP估计他的value function。下一章通过Model free control的方法针对一个unknown的MDP optimise value function。 2 Monte…

Android类似微信聊天页面教程(Kotlin)五——选择发送图片

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …