探究多线程和异步「建议收藏」

探究多线程和异步「建议收藏」在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问

大家好,欢迎来到IT知识分享网。

一. 背景

在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并发问题,后面随着处理的系统业务越来越复杂,多线程再也回避不了了,也就借此机会深入研究了一下.Net中的多线程的处理方案。

  发现在.Net领域中,多线程的处理大致经历了这么几个阶段:Thread→ThreadPool→委托的异步调用→Task→TaskFactory→Parallerl→异步编程模型(async和await)。

本质: 充分发掘CPU的性能,把一些并没有先后强依赖关系、且耗时代码块放到一个新的线程里去处理,那么原先按顺序执行的业务就会变成并行执行,让主线程继续往后执行,节约了时间了,提高了效率。

下面补充一下多线程在时间和空间上的开销:

(一). 时间上:

①:开启或销毁一个线程都会通知进出中的dll程序集,让这些dll进行相应的操作。

②:时间片切换:4个逻辑处理器(不考虑Inter的超线程技术,一核对多个线程),同时并行只能处理4个线程,多余的休眠,很多时候,我们看似很多线程在并行执行,实际上是间歇性的串行。

《关于这个说法有异议的话,请留下您的见解,欢迎讨论》

(二). 空间上:

①:用户模式堆栈,一个线程分配1M的堆栈空间。

②:内核模式的堆栈,用户模式的参数需要传递到内核模式。

③:线程的内核数据结构,会存放一下变量。

二. 概念的梳理

1. 进程、线程和多线程

  进程:当一个程序开始运行时,它就是一个进程(或者多个,eg:游戏),进程包括运行中的程序和程序所使用到的内存和系统资源,而一个进程又是由多个线程组成。

  线程:线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

  多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

2. 多线程的好处和弊端

  好处:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。(牺牲空间资源,来换取时间)

  弊端:

  ①:线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;(占内存多)

  ②:多线程需要协调和管理,所以需要CPU时间跟踪线程; (占cpu多)

  ③:线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;(多线程存在资源共享问题)

  ④:线程太多会导致控制太复杂,最终可能造成很多Bug。(管理麻烦,产生意外bug)

3. 何时建议使用多线程

  ①. 当主线程试图执行冗长的操作,但系统会卡界面,体验非常不好,这时候可以开辟一个新线程,来处理这项冗长的工作。

  ②. 当请求别的数据库服务器、业务服务器等,可以开辟一个新线程,让主线程继续干别的事。

  ③. 利用多线程拆分复杂运算,提高计算速度。

4. 何时不建议使用多线程

  当单线程能很好解决,就不要为了使用多线程而用多线程。

C++后台开发架构师免费学习地址:C/C++Linux鏈嶅姟鍣ㄥ紑鍙�/鍚庡彴鏋舵瀯甯堛€愰浂澹版暀鑲层€�-瀛︿範瑙嗛鏁欑▼-鑵捐璇惧爞

【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以自行点击 「链接」 群文件共享

探究多线程和异步「建议收藏」

5. 同步调用和异步调用

①单线程同步调用:方法从上而下一次执行,一步一步执行,有先后顺序。

探究多线程和异步「建议收藏」

  ②异步调用(区别于异步方法):开启新的线程去执行业务,主线程单独执行,可以选择是否等待子线程执行完后再执行

探究多线程和异步「建议收藏」

同步方法 VS 异步方法:

1. 一个误区:异步方法指的是一些特有的方法(并不开启新线程),它和开启一个新的线程比如“很多情况下我们会说,开启一个新的线程去异步调用”,这不是一回事,典型的异步方法,比如js 的ajax请求。

2. 同步方法:我们平时封装的一些普通方法大多数都是同步方法,同步方法典型的特点:就是在没有得到方法的返回值或者该方法没有执行完,该调用就需要在这等待,不能继续执行。

3. 异步方法:异步方法在调用后,调用这在没有得到返回结果前,就可以继续执行后续业务,异步方法通常是通过通知、回调的方式告诉调用者,无须消耗过多的性能。

举例1:   

$.Post(“url”,{},function(data){ });   

$(“#div1”).html(“”); 这两行代码,第一行发送异步请求的时候,即使得到回调返回值,下面清空div1内容的操作同样也将执行,Post就是异步方法。

举例2:  

先封装1个方法: function Add(a,b){ 先休眠5s; return a+b}   

调用:   

Add(1,2); $(“#div1”).html(“”);

这两行代码,Add方法就属于同步方法,所以必须等5s后,Add方法执行完,才能执行下面清空div1内容的操作。  

总结:同步方法和异步方法的区别就是:是否需要等待返回结果,才能执行后续操作。

6. 异步多线程的三个特点

  ①:同步方法卡界面,原因是主线程被占用;开启新线程去异步调用不卡界面,原因是计算交给了别的线程,主线程空闲.

  ②:同步方法慢,原因是只有一个线程计算;开启新线程去异步调用快,原因是多个线程同时计算,但是更消耗资源,不宜太多.

  ②:异步多线程是无序的,启动顺序不确定、执行时间不确定、结束时间不确定.

原文地址:多线程和异步系列 – Yaopengfei – 博客园

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6948.html

(0)
上一篇 2023-01-03 09:54
下一篇 2023-01-03 09:54

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信