pthread_create函数阻塞了主线程_5个状态,Python 中线程的生命周期

编 程 的 朝 圣 之 路

----------------------------------------

当程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程。

那么,CPU 在轮换执行线程的过程中,即从创建到消亡的整个过程,可能会历经 5 种状态,分别是新建、就绪、运行、阻塞和死亡。

51f5599b08863137aee5a3e06402856b.png

线程的新建状态

无论是通过 Thread 类直接实例化对象创建线程,还是通过继承自 Thread 类的子类实例化创建线程,新创建的线程在调用 start() 方法之前,不会得到执行,此阶段的线程就处于新建状态。

线程的就绪状态

当位于新建状态的线程调用 start() 方法后,该线程就转换到就绪状态。

所谓就绪,就是告诉 CPU,该线程已经可以执行了,但是具体什么时候执行,取决于 CPU 什么时候调度它。

换句话说,如果一个线程处于就绪状态,只能说明此线程已经做好了准备,随时等待 CPU 调度执行,并不是说执行了 start() 方法此线程就会立即被执行。

线程的运行状态

当位于就绪状态的线程得到了 CPU,并开始执行 target 参数执行的目标函数或者 run() 方法,就表明当前线程处于运行状态。

但如果当前有多个线程处于就绪状态(等待 CPU 调度)时,处于运行状态的线程将无法一直霸占 CPU 资源,为了使其它线程也有执行的机会,CPU 会在一定时间内强制当前运行的线程让出 CPU 资源,以供其他线程使用。

线程的阻塞状态

当 CPU 对多个线程进行调度时,对于获得 CPU 调度却没有执行完毕的线程,就会进入阻塞状态。

目前几乎所有的桌面和服务器操作系统,都采用的是抢占式优先级调度策略。即 CPU 会给每一个就绪线程一段固定时间来处理任务,当该时间用完后,系统就会阻止该线程继续使用 CPU 资源,让其他线程获得执行的机会。

对于具体选择那个线程上 CPU,不同的平台采用不同的算法,比如先进先出算法(FIFO)、时间片轮转算法、优先级算法等,每种算法各有优缺点,适用于不同的场景。

除此之外,如果处于运行状态的线程发生如下几种情况,也将会由运行状态转到阻塞状态:

  • 线程调用了 sleep() 方法;
  • 线程等待接收用户输入的数据;
  • 线程试图获取某个对象的同步锁时,如果该锁被其他线程所持有,则当前线程进入阻塞状态;
  • 线程调用 wait() 方法,等待特定条件的满足。

以上几种情况都会导致线程阻塞,只有解决了线程遇到的问题之后,该线程才会由阻塞状态转到就绪状态,继续等待 CPU 调度。

以上 4 种可能发生线程阻塞的情况,解决措施分别如下:

  • sleep() 方法规定的时间已过;
  • 线程接收到了用户输入的数据;
  • 其他线程释放了该同步锁,并由该线程获得;
  • 调用 set() 方法发出通知。

线程死亡状态

对于获得 CPU 调度却未执行完毕的线程,它会转入阻塞状态,待条件成熟之后继续转入就绪状态,重复争取 CPU 资源,直到其执行结束。

执行结束的线程将处于死亡状态。

线程执行结束,除了正常执行结束外,如果程序执行过程发生异常(Exception)或者错误(Error),线程也会进入死亡状态。

对于处于死亡状态的线程,有以下 2 点需要注意:

  • 主线程死亡,并不意味着所有线程全部死亡。也就是说,主线程的死亡,不会影响子线程继续执行;反之也是如此。
  • 对于死亡的线程,无法再调用 start() 方法使其重新启动,否则 Python 解释器将抛出 RuntimeError 异常。
python高级用法_iOS-创客学院​www.makeru.com.cn
32ffc16108b453e37b603c562d88ab66.png

bb63461cc0db1c3ea87b005264d9f6bf.png

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

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

相关文章

ASP.NET AJAX入门系列(3):使用ScriptManagerProxy控件

在ASP.NET AJAX中,由于一个ASPX页面上只能有一个ScriptManager控件,所以在有母版页的情况下,如果需要在Master-Page和Content-Page中需要引入不同的脚本时,这就需要在Content-page中使用ScriptManagerProxy,而不是Scri…

程序员面试金典 - 面试题 16.04. 井字游戏(计数)

1. 题目 设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ",“X"和"O"组成,其中字符” "代表一个空位。 以下是井字游戏的规则: 玩家轮流将字符放入空…

pygame render怎么显示中文_Pygame游戏——贪吃蛇(完结)

我们的贪吃蛇游戏基本功能已经实现,可以完成吃食物,吃到食物变长,得分增加,食物再次随机出现。但是我们有发现贪吃蛇可以穿到屏幕外面去,这显然是不合适的。这一次我们需要完善的是:游戏结束游戏结束后重新…

程序员面试金典 - 面试题 17.18. 最短超串(双指针+哈希)

1. 题目 假设你有两个数组,一个长一个短,短的元素均不相同。 找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个…

Symbian中不能跨越线程(RThread)使用的对象/组件(RSocket/Memery Heap,etc)

在Symbian C的编程中,出现一很多与Windows/linux用法与概念不同的东西。 首先,在Symbian中不建议多线程,因为线程的开销,也因为线程之间有很多东西不能传递与共享(虽然同一进程中不同线程也是在同一个地址空间中&#…

Diffusion卷向视频,谷歌CEO劈柴亲自“带货”

源|机器之心编|张倩、杜伟谷歌、Meta 等科技巨头又挖了一个新坑。在文本转图像上卷了大半年之后,Meta、谷歌等科技巨头又将目光投向了一个新的战场:文本转视频。上周,Meta 公布了一个能够生成高质量短视频的工具——Ma…

pmp知识点详解-项目大牛整理_PMP核心知识点—第四章:项目整合管理(一)

文章来源:科科过PMP作者:科科过PMP由知乎号“慧翔天地PMP”推荐如有侵权请联系小编看到后第一时间处理一、制定项目章程1Inputs⑴商业文件→商业论证:①记录项目目标以及项目对目标的贡献②决定项目的期望结果是否值得所需投资③包含商业需求…

程序员面试金典 - 面试题 17.15. 最长单词(排序+递归)

1. 题目 给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。 若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。 示例&#xff1a…

.net 2.0 制作 柱状图

最近项目需要用到图表,饼图,柱状图,这些都很常用,在网上找了下,不是自已要的,只好自已动手做个,先做了个柱状图,先看下效果图代码有详解下载代码 此代码在winform环境下编译通过,要用在web环境也简单,只需将Graphics对…

不卷大厂了,78位高校青年教师晒出工资

源|青塔人才综合自知乎、小红书今天,小编给大家搜罗了江苏、浙江、上海、广东、山东、北京、福建、广西、云南、陕西、川渝、中部、东北地区78位高校教师的薪资待遇,欢迎转发分享~江苏常四荒:普通高校,讲师…

牛客练习赛61 - A - 打怪

题目描述 你是一个勇士,现在你准备去森林刷毛球怪,你有两个属性(血量,攻击力),毛球怪也有这两个属性。 当你遭遇一只毛球怪时你们会进入战斗,然后你和毛球怪轮流攻击(你先手&#x…

javascript 的参数有长度限制吗?一个细节引起的误区

一个普通的javascrip函数&#xff0c;只有一个入口参数 function test(info) ... { alert(info); } 页面用是aspx代码生成&#xff0c;调用test函数的入口参数可能是一个很长的字符串&#xff0c;同时页面上根据一个数据集构造很多如下所示的标签。 < a href " jav…

CCF列表更新引热议:ICLR未上榜,NAACL等级上升

编 | 卖萌酱2021年1月&#xff0c;CCF决定启动新一轮中国计算机学会推荐国际学术会议和期刊目录&#xff08;一下简称《目录》&#xff09;调整工作并委托CCF学术工作委员会组织实施。经过前期的充分讨论和论证后&#xff0c;于2021年9月开始正式向各专委会征集调整建议。期间由…

centos mysql jar 驱动包_JDBC连接MySQL的数据库

JDBC连接MySQL的数据库开发工具&#xff1a;eclipes数据库&#xff1a;mysql 5.6jdk&#xff1a;1.8目的&#xff1a;通过简单示例&#xff0c;教会大家如何通过java的代码实现的MySQL的数据库访问。访问数据库&#xff1a;首先要加载数据库的驱动程序(只需要在第一次访问数据库…

牛客练习赛61 - B - 吃水果

题目描述 最近米咔买了n个苹果和m个香蕉&#xff0c;他每天可以选择吃掉一个苹果和一个香蕉&#xff08;必须都吃一个&#xff0c;即如果其中一种水果的数量为0&#xff0c;则他不能进行这个操作&#xff09;&#xff0c;或者使用魔法将某一种水果的数量翻倍。 现在米咔想吃西…

SQL Server中的数据类型详解

(1)char、varchar、text和nchar、nvarchar、ntextchar 和varchar的长度都在1到8000之间&#xff0c;它们的区别在于char是定长字符数据&#xff0c;而varchar是变长字符数据。所谓定长就是长度固定的&#xff0c;当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面…

java定时器只执行一次_面试阿里P6,却被MySQL难倒,二战阿里,挤进天猫团队(Java岗)...

爱因斯坦说过“耐心和恒心总会得到报酬的”&#xff0c;我也一直把这句话当做自己的座右铭&#xff0c;这句箴言在今年也彻底在我身上实现了。每一个程序员都拥有一座大厂梦&#xff0c;我也不例外&#xff0c;去年面试阿里P6&#xff0c;竟然被MySQL问倒了&#xff0c;很多相关…

推荐一个动漫风格转换的开源项目!可在线运行

文 | 超神经源 | HyperAIAnimeGANv2 最近发布了一项更新&#xff0c;由社区贡献者开发&#xff0c;通过 Gradio 实现了一个可以在线运行的 Demo&#xff0c;发布在 huggingface 上。访问链接&#xff1a;https://huggingface.co/spaces/akhaliq/AnimeGANv2即可在线上轻松实现 A…

程序员面试金典 - 面试题 16.09. 运算(只用+法做乘除)

1. 题目 请实现整数数字的乘法、减法和除法运算&#xff0c;运算结果均为整数数字&#xff0c; 程序中只允许使用加法运算符和逻辑运算符&#xff0c;允许程序中出现正负常数&#xff0c;不允许使用位运算。 你的实现应该支持如下操作&#xff1a; Operations() 构造函数min…

python语言支持函数式编程_Python语言之Pyhton入门笔记函数式编程

本文主要向大家介绍了Python语言之Pyhton入门笔记函数式编程&#xff0c;通过具体的内容向大家展示&#xff0c;希望对大家学习Python语言有所帮助。 一&#xff0c;匿名函数 def add(x,y) return xy print(add(2,3)) flambda x,y:xy #匿名函数需要lambdb来指定&#xff0c;lam…