趣谈Qt多线程(1)
作者:互联网
好久没写文章了,一直觉得写文章很费时间也没什么人看,但是还是觉得自己应该写一写,写文章并不全是给别人看,也算是自己的一个记录,记录自己的职业生涯中的一些感触和犯二瞬间。
话不多说,开始今天的表演。
1 什么是多线程
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
什么是多线程呢?即就是一个程序中有多个线程在同时执行。
对于这种比较正式的解释对于熟悉多线程的人来说,和理解1+1=2没有本质的区别,但是对于一些刚入门的新人来说,还是存在一定的理解成本。今天就换一个方式解释一下什么是多线程。
首先还是让大圣来解释一下吧!
孙悟空拔几根毫毛,吹一口气就出来好几个猴子分身,一个给他端茶,一个给他捏脚,还有给帮他打怪升级。而他自己在干嘛呢?可能是在躺着吃桃子,也可能在当吃瓜群众,也可能在一旁指挥。
其实多线程和孙悟空的分身异曲同工,他的主要作用就是用来分担主线程的压力,而这些分身就是所谓的子线程。
1.1 什么多线程
一般的小程序采用单线程即主线程就可以实现目的,这种模式下的功能都相对比较单一且具有一定的执行逻辑顺序。例如买张机票出行,买票 -> 排队安检 -> 登机 只要按这样的流程走下去就行了(想跳过流程的同志估计也不是什么好同志,机场也不答应)。那么问题来了,这一天小猿和一个女性朋友一起出行(程序猿也有春天),排队人很多(可能是春运),突然这位女性朋友想要喝一杯热的奶茶。请问小猿该怎么办?说拒绝的请自动离开本页面;跳出排队出去买的,恭喜你好人卡一张;机智的本猿果断叫了一个跑腿,自己还在这排队同时等着跑腿送奶茶过来。
从这个事情来看多线程,1 跑腿需要我手动去叫 -- 多线程也需要手动创建和开启
2 叫玩跑腿我会付出额外的跑腿费 -- 多线程也不能白P,也需要额外的资源开销
3 我排队和买奶茶两件事情是独立进行的,互不影响 -- 多线程之间也相对比较独立,各干各的事情
4 飞机都起飞了,奶茶还没送到 -- 多线程也会出现这种情况,不能在适当的时机完成工作(实际代码中会记性逻辑处理)
实际结果就是本猿牵着这位喝着热奶茶的女性朋友的手,顺利快速的排队过了安检。
多线程其实不止是分担任务这么简单,在Qt中UI线程处于主线程,如果所有任务都交给主线程处理,那么我们的界面就可以像树懒一样流畅的运动了。例如我们在软件界面中单线程下载一个较大的文件,点击下载我们的程序就开始进行下载任务,这时候界面处于阻塞状态(卡死状态),试想一下如果是你在用这个软件,你想不想打死这个程序员。
1.2 什么情况用多线程
多线程其实和初恋女友差不多,看起来清纯美好,但用起来感受怎么样只有自己知道。老司机得心应手,萌动少年四处碰壁。
因为多线程中不同线程处于相对独立的工作状态,因为多线程的同步和管理相对单线程来说会更加困难,同时多线程中也会出现很多单线程中不会出现的匪夷所思、奇形怪状的问题。那么到底该在什么情况下使用多线程呢?
1、 程序包含复杂的计算任务,同时需要保证主线程实时性的情况
主要是利用多线程获取更多的CPU时间(资源)。
2、 处理速度较慢的外围设备
比如:打印时。再比如网络程序,涉及数据包的收发,时间因素不定。使用独立的线程处理这些任务,可使程序无需专门等待结果。
3、 程序设计自身的需要
WINDOWS系统是基于消息循环的抢占式多任务系统,为使消息循环系统不至于阻塞,程序需要多个线程的来共同完成某些任务。
多线程的缺点:
1. 如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换.
2. 更多的线程需要更多的内存空间
3. 线程中止需要考虑对程序运行的影响.
4. 通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生
很多时候在有界面的情况下,尤其是Qt界面程序中,主程序只会承担较少的工作任务,甚至可能长期处于空闲状态(黑心老板),主线程中主要就进行页面的刷新、逻辑的指挥以及结果的处理。
-------------------码字不易,请关注和点赞,支持一下脱发的小猿--------------------------
下篇文章将继续多线程的具体使用及其代码(看黑心老板是怎么找到员工、指挥员工、收割果实)
标签:趣谈,Qt,排队,程序,跑腿,线程,奶茶,多线程 来源: https://blog.csdn.net/Lewispu/article/details/114783251