0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么说线程是轻量级的概念呢?守护线程是指什么?

冬至配饺子 来源:多兰多 作者:Toranto 2022-08-19 10:39 次阅读

线程-Thread

进程是计算机中最小的资源分配单位,创建一个进程,操作系统需要向其分配一定的内存资源。所以进程对于操作系统来说还是有一定的负担。

线程是计算机中被CPU调度的最小单位,进程中的代码是由线程来完成的,每个进程可以有多个线程,但是至少要有一个线程。

poYBAGL-9e6AbR-PAABgWuObfCs448.png

线程是一个轻量级概念,它没有属于自己的资源。同一个进程中的所有的线程的资源是共享的。在Python中,一个进程中的多个线程无法并行,只能并发执行(Java,C++, C#C语言中是可以的),主要是因为Python属于解释型语言,而Java,C语言属于编译型语言,Python中有独有的GIL(Global Interpreter Lock)全局解释器锁。

编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。而相对的,解释性语言编写的程序不进行预先编译,以文本方式存储程序代码。在发布程序时,看起来省了道编译工序。但是,在运行程序的时候,解释性语言必须先解释再运行。

线程和进程之间的区别主要在于:

占用的资源

调度的效率

资源是否共享

创建线程与创建进程的操作几乎相同:

pYYBAGL-9gKARJgJAABIMAUAN68733.png

为什么说线程是轻量级的概念呢?

poYBAGL-9iiAWB3OAAD6DyC2Fws210.pngpYYBAGL-9i6AExw_AAAaVw31UnA289.png

poYBAGL-9jSAEc6WAACvbpHmY30646.png

结果显而易见的。

守护线程-setDaemon

守护线程是指在程序运行的时候在后台提供一种通用服务的线程。

守护线程的特性在进程中已经有过阐述,守护线程和守护进程其实差不多,但还是有些许差别:

pYYBAGL-9liAEtjtAACZqwqIfM8039.png
poYBAGL-9l2AJ_P9AAEL_XMnQEs674.png

从结果可以看出,守护线程并没有像进程一样,在主进程的代码结束之后便结束,反而等全部线程执行完毕之后再结束。因为在同一个进程中,多个线程的资源是共享的,因此守护线程的守护对象应该是全部线程而不是进程(进程的代码也要靠线程来执行)

当同时满足以下两个条件时,就会出现线程的安全问题①多个线程在操作共享的数据;②操作共享数据的线程代码有多条。

举例:

poYBAGL-9pWARoH8AADC8qOIQm0381.png

从一百到十万结果基本上都是0,但是当循环次数扩大到100万的时候,问题就开始显现了:

pYYBAGL-9qqAK9btAACECgNbUeg416.png

和进程修改共享数据的原理是一样的,多个线程多个代码对同一个共享数据进行修改,次数足够大时难免会出现同时操作的现象,自然而然就会产生数据的误差的问题。所以可以引入线程锁Lock的概念方法,进程锁Lock的原理为同一时刻只允许一个进程对数据进行修改,线程锁Lock的原理就是同一时刻只允许一个线程对数据进行修改。

poYBAGL-9tOAMKJuAADhflZ64zI074.pngpYYBAGL-9tmAb5xUAAAugfDMaA8606.pngpoYBAGL-9t6AbSU4AAC4B03wYso423.png

这样就保护了数据安全,但是时间相对来说就长了很多很多

递归锁-RLock

递归锁的讲解需要引入“哲学家吃面问题”


poYBAGL-9viAX70ZAACpDeTiA1M018.png

所谓哲学家吃面问题就是每个哲学家必须要抢到叉子和面条才能够继续使程序继续进程,否则程序就会陷入死锁状态。也就是有两把锁,线程需要同时拿到两把才能够程序继续运行,否则一把锁被一个线程拿到,另一把锁被另一个线程拿到,这样两把锁就无法同时解锁,就进入死锁状态。

写一个死锁程序:

pYYBAGL-9yGAGzVCAAGI8nklWz4996.pngpoYBAGL-9yaAPJnuAABbjpV7BcQ034.pngpoYBAGL-9yuAFTlPAAD9XHPn8Rk162.png

当eat1激活了noodle_lock之后,eat2的noodle_lock必须等到ea1释放才能激活。而eat1代码顺序为先面条后叉子,eat2代码顺序为先叉子后面条,所以在相同反应的情况下,哲学家2抢到面条的同时,哲学家3抢到了叉子,两个人同时抢到更靠近自己的东西,谁也不放手,表现为程序无法进行下去,也就是死锁现象。(为什么要用eat1和eat2两个方法,而不是只用eat1一个方法?是因为需要有一个偏向值,eat1更偏向面条,所以哲学家1和2更容易抢到面条,eat2更偏向叉子,所以哲学家3和4更容易抢到叉子。如果只用一个eat,那么表现为哲学家们按顺序吃面条(同步))

而且解锁的顺序也颇为讲究,采用后进先出法,具体表现为以下的图,第一道门开了锁进去,再开第二道锁再进去,那么出来的时候需要锁门,锁门就要先锁里面的门,不然都出来了还怎么锁里面的门呢?

pYYBAGL-9z2ABTFVAAA6yqcn7IM453.png

为了解决死锁现象,threading模块中还提供了RLock递归锁的方法,

poYBAGL-92WAHgiNAAF8jn9_U2Q744.pngpYYBAGL-92uAINWZAACMOrYbLN8859.pngpYYBAGL-93CAf3xAAADrsjiSmws218.png

当多个线程同时抢多把锁的时候就会出现死锁的现象。其实递归锁也不是一个很好地解决方案,死锁现象的发生不是互斥锁的原因,而是程序猿/媛的逻辑出现了问题。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10825

    浏览量

    211146
  • 计算机
    +关注

    关注

    19

    文章

    7419

    浏览量

    87714
  • 操作系统
    +关注

    关注

    37

    文章

    6738

    浏览量

    123190
  • C语言
    +关注

    关注

    180

    文章

    7598

    浏览量

    136186
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19651
收藏 人收藏

    评论

    相关推荐

    Linux多线程编程基础知识解析

    线程轻量级的进程(`LWP: Light Weight Process`),在`Linux`环境下线程的本质仍是`进程`,进程是资源分配的`最小单位`,线程是操作系统调度执行的`最小
    发表于 07-14 16:41 780次阅读
    Linux多<b class='flag-5'>线程</b>编程基础知识解析

    什么是守护线程守护线程的底层原理和使用示例

    大家好,今天这篇文章来梳理一下有关守护线程的相关问题,这也是之前曾经有被问到过的面试题,在此之前我们先看一看守护线程的使用示例。
    的头像 发表于 01-05 11:01 1346次阅读
    什么是<b class='flag-5'>守护</b><b class='flag-5'>线程</b>?<b class='flag-5'>守护</b><b class='flag-5'>线程</b>的底层原理和使用示例

    Java守护线程和本地线程的区别

    java中的线程分为两种:守护线程(Daemon)和用户线程(User)。
    发表于 08-07 08:10

    嵌入式Linux多任务编程、进程、线程分别是什么意思

    ,它是系统进行资源分配和调度的基本单元*//*线程:线程是进程内独立的一条运行路线,也可以称为轻量级进程。线程可以对进程的内存空间和资源进行访问,一个进程可以拥有多个
    发表于 12-22 07:43

    多核架构及多线程编程

    线程(thread)是进程上下文(context)中执行的代码序列,又被称为轻量级进程(light weight process) 在支持多线程的系统中,进程成为资源分配和保护的实体,而线程
    发表于 09-11 16:12 10次下载
    多核架构及多<b class='flag-5'>线程</b>编程

    解决线程安全问题技巧汇总

    线程,有时被称为轻量级进程,是程序执行流的最小单元。一个标准的线程线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中
    发表于 12-01 13:42 1578次阅读

    什么是线程

    线程轻量级进程;使用线程节省了 CPU 周期的浪费,同时提高了应用程序的效率
    的头像 发表于 01-20 15:17 1863次阅读
    什么是<b class='flag-5'>线程</b>

    什么是多线程

    被定义为程序的执行路径,也叫执行单元 线程轻量级进程;使用线程节省了 CPU 周期的浪费,同时提高了应用程序的效率 进程 是Windows系统中的一个基本概念,它包含着一个运行
    的头像 发表于 02-28 09:56 1195次阅读
    什么是多<b class='flag-5'>线程</b>

    详解Linux线程线程与异步编程、协程与异步

    协程不是系统级线程,很多时候协程被称为“轻量级线程”、“微线程”、“纤程(fiber)”等。简单来说可以认为协程是线程里不同的函数,这些函数
    的头像 发表于 03-16 15:49 946次阅读

    线程编程可以应用在哪里?C++多线程详解

    线程并发指的是在同一个进程中执行多个线程。 优点: 有操作系统相关知识的应该知道,线程轻量级的进程,每个线程可以独立的运行不同的指令序列
    发表于 04-13 10:10 666次阅读

    进程和线程的区别

    每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),
    的头像 发表于 05-09 11:06 5980次阅读
    进程和<b class='flag-5'>线程</b>的区别

    什么是虚拟线程?虚拟线程到底是做什么用的

    虚拟线程是在Java并发领域添加的一个新概念,那么虚拟线程到底是做什么用的
    的头像 发表于 10-29 10:23 3061次阅读
    什么是虚拟<b class='flag-5'>线程</b>?虚拟<b class='flag-5'>线程</b>到底是做什么用的<b class='flag-5'>呢</b>?

    线程池基本概念与原理

    一、线程池基本概念与原理 1.1 线程概念及优势 C++线程池简介 线程池是一种并发编程技术,
    的头像 发表于 11-10 10:24 486次阅读

    如何查看一个线程的ID

    1.什么是线程? linux内核中是没有线程这个概念的,而是轻量级进程的概念:LWP。一般我们所说的线程
    的头像 发表于 11-13 14:38 1314次阅读
    如何查看一个<b class='flag-5'>线程</b>的ID

    mcu线程和进程的区别是什么

    是程序执行的基本单位,它是进程中的一个实体,是进程内的一条执行路径。线程是CPU调度的最小单位,它可以看作是轻量级的进程,不拥有独立的地址空间。线程共享进程的资源(如堆、文件描述符等),同一进程内的多个
    的头像 发表于 01-04 10:45 692次阅读