同步异步多线程这三者关系,你能给面试官一个满意的回答吗?
前几天一位朋友去面试,面试官问了他同步,异步,多线程之间是什么关系,异步比同步高效在哪?多线程比单线程高效在哪?由于回答的不好,让我帮他捋一下,其实回答这个问题不难,难就难在只对别人说理论,而没有现杀的例子。一:异步1。到底解放了谁?从基础的同步说起
要说解放了谁,一定得有几个参与者,举个例子:当你的主线程读取一个应用程序之外的资源时,它有可能是一个文件,又有可能是一个外部服务,当用同步方式读取外部服务时,首先主线程会从用户模式进入到内核模式,在内核模式中windows会将你的请求数据交给对应的网络驱动程序,继后会让这个线程进入休眠状态,当网络驱动程序和外部服务一阵痉挛之后,网络驱动程序会将获取到的结果交给当初休眠的线程,windows唤醒休眠线程继而执行后续的C代码,画个简图理解一下,不一定全对。
这里就存在着一个非常大的问题,步骤4步骤7之间,你的主线程一直都是休眠状态,比如在GUI编程中,有一个重要的原则就是解放你的UI线程(主线程),所以解决这个问题就迫在眉睫。异步方式下的处理方案
说到这里,大家应该知道了异步方式就是为了解放主线程,又可以叫调用线程,没错,接下来看一下同样的场景在异步中如何处理的。
从图中可以看到,步骤三中将thread数据交给网络驱动程序之后,该thread就直接返回不管了,当后续网络驱动程序获取数据后,将数据丢给CLR线程池中的IO线程再由它触发你的回调函数。总结
异步相比同步效率高就高在解放了调用线程,在驱动程序和远程服务RoundTrip期间,调用线程还可以执行其他工作,放在GUI上就是主线程可以继续响应用户的超敏操作。
由于没有空转的线程,CPU可以得到最满载的运转,更少的线程就有更少的线程栈空间,更少的GC回收时间和上下文切换。2。代码演示
还是那句话,光说可不行,你得上一点代码看看,有了上面的理论基础,这里我就模拟爬取下博客园首页的所有文章的用户头像。同步代码publicstaticvoidMain(string〔〕args){SingleThreadDownloadImages();Console。WriteLine(主线程继续执行其他的咯);Console。Read();}publicstaticvoidSingleThreadDownloadImages(){using(varclientnewHttpClient()){调用线程空转等待varcontentclient。GetStringAsync(http:cnblogs。com)。Result;varhtmlnewHtmlDocument();html。LoadHtml(content);varimgsrcListhtml。DocumentNode。QuerySelectorAll(img。pfs)。Select(mm。Attributes〔src〕。Value)。ToList();Console。WriteLine(34;准备下载:{imgsrcList。Count}个。。。);for(inti0;iimgsrcList。Count;i){调用线程空转等待varstreamclient。GetStreamAsync(imgsrcList〔i〕)。Result;Image。FromStream(stream)。Save(C:2{i}。jpg);}}Console。WriteLine(SingleThreadDownloadImages执行结束);}output准备下载:19个。。。SingleThreadDownloadImages执行结束主线程继续执行其他的咯异步代码publicstaticvoidMain(string〔〕args){AsyncDownloadImages();Console。WriteLine(主线程继续执行其他的咯);Console。Read();}publicstaticasyncvoidAsyncDownloadImages(){using(varclientnewHttpClient()){varcontentawaitclient。GetStringAsync(http:cnblogs。com);varhtmlnewHtmlDocument();html。LoadHtml(content);varimgsrcListhtml。DocumentNode。QuerySelectorAll(img。pfs)。Select(mm。Attributes〔src〕。Value)。ToList();Console。WriteLine(34;准备下载:{imgsrcList。Count}个。。。);for(inti0;iimgsrcList。Count;i){varstreamawaitclient。GetStreamAsync(imgsrcList〔i〕);Image。FromStream(stream)。Save(C:2{i}。jpg);}Console。WriteLine(AsyncDownloadImages执行结束);}}output主线程继续执行其他的咯准备下载:19个。。。AsyncDownloadImages执行结束
从结果可以看出,异步在获取图片期间,主线程还可以做其他事情,这就是异步最大的特点。3。windbg提取是否真为线程池io线程
其实在图2中我口口声声的说是线程池中的IO线程回调了你的函数,大家先要明白一个概念,线程池中有两种类别的线程,一个是工作线程,一个是IO线程,而工作线程常常就是我们通过代码进行操控,IO线程通常由底层CLR接管,常常用于处理外部资源的操作,如下ThreadPool的GetMaxThreads方法。publicstaticvoidGetMaxThreads(outintworkerThreads,outintcompletionPortThreads);
有了这个基础,再将AsyncDownloadImages方法修改如下,抓取一下dump文件varcontentawaitclient。GetStringAsync(http:cnblogs。com);Console。WriteLine(34;已获取到:{content。Length}个字符);Console。ReadLine();
e!clrstack查看所有托管线程的调用堆栈0:000e!clrstackOSThreadId:0x62d8(13)ChildSPIPCallSite000000da9b1fd1e800007ff9fc7bb4f4〔GCFrame:000000da9b1fd1e8〕000000da9b1fd30800007ff9fc7bb4f4〔GCFrame:000000da9b1fd308〕000000da9b1fd36800007ff9fc7bb4f4〔HelperMethodFrame1OBJ:000000da9b1fd368〕System。Threading。Monitor。Enter(System。Object)000000da9b1fd46000007ff9e42f8affSystem。IO。TextReaderSyncTextReader。ReadLine()000000da9b1fd4c000007ff9e40f0d98System。Console。ReadLine()000000da9b1fd4f000007ff985c81559ConsoleApp2。Programd3。MoveNext()〔C:dreamCsharpConsoleApp1ConsoleApp2Program。cs93〕000000da9b1fd69000007ff9e388cef2System。Threading。ExecutionContext。RunInternal(System。Threading。ExecutionContext,System。Threading。ContextCallback,System。Object,Boolean)000000da9b1fd76000007ff9e388cd75System。Threading。ExecutionContext。Run(System。Threading。ExecutionContext,System。Threading。ContextCallback,System。Object,Boolean)000000da9b1fd79000007ff9e38fbe2fSystem。Runtime。CompilerServices。AsyncMethodBuilderCoreMoveNextRunner。Run()000000da9b1fd7e000007ff9e3901343System。Threading。Tasks。AwaitTaskContinuation。RunOrScheduleAction(System。Action,Boolean,System。Threading。Tasks。TaskByRef)000000da9b1fd83000007ff9e3865f40System。Threading。Tasks。Task。FinishContinuations()000000da9b1fd8c000007ff9e3865a88System。Threading。Tasks。Task1〔〔System。Canon,mscorlib〕〕。TrySetResult(System。Canon)000000da9b1fd90000007ff9e3865a05System。Threading。Tasks。TaskCompletionSource1〔〔System。Canon,mscorlib〕〕。TrySetResult(System。Canon)000000da9b1fd94000007ff9c88311a3System。Net。Http。HttpClientcDisplayClass3101〔〔System。Canon,mscorlib〕〕。b1(System。Threading。Tasks。Task1)000000da9b1fd99000007ff9e38f9d47System。Threading。Tasks。Task。Execute()000000da9b1fd9d000007ff9e388cef2System。Threading。ExecutionContext。RunInternal(System。Threading。ExecutionContext,System。Threading。ContextCallback,System。Object,Boolean)000000da9b1fdaa000007ff9e388cd75System。Threading。ExecutionContext。Run(System。Threading。ExecutionContext,System。Threading。ContextCallback,System。Object,Boolean)000000da9b1fdad000007ff9e38fa001System。Threading。Tasks。Task。ExecuteWithThreadLocal(System。Threading。Tasks。TaskByRef)000000da9b1fdb8000007ff9e38f96e1System。Threading。Tasks。Task。ExecuteEntry(Boolean)
!threads查看编号13的线程类型0:013!threadsThreadCount:8UnstartedThread:0BackgroundThread:5PendingThread:0DeadThread:2HostedRuntime:noLockIDOSIDThreadOBJStateGCModeGCAllocContextDomainCountAptException015754000001e2be060f802a020Preemptive000001E2BFD19868:000001E2BFD19FD0000001e2be053bb01MTA6265e0000001e2be08bd002b220Preemptive0000000000000000:0000000000000000000001e2be053bb00MTA(Finalizer)9325c000001e2d8435ef0102a220Preemptive0000000000000000:0000000000000000000001e2be053bb00MTA(ThreadpoolWorker)XXXX40000001e2d845ea301039820Preemptive0000000000000000:0000000000000000000001e2be053bb00Ukn(ThreadpoolWorker)12623fc000001e2d8469ea0202b220Preemptive000001E2BFD1E188:000001E2BFD1FFD0000001e2be053bb01MTA13762d8000001e2d8475e20a029220Preemptive000001E2BFD9D588:000001E2BFD9F250000001e2be053bb00MTA(ThreadpoolCompletionPort)XXXX80000001e2d847a0b08039820Preemptive0000000000000000:0000000000000000000001e2be053bb00Ukn(ThreadpoolCompletionPort)1496e4000001e2d847de708029220Preemptive000001E2BFD80D88:000001E2BFD81F10000001e2be053bb00MTA(ThreadpoolCompletionPort)
其中的13762d8000001e2d8475e20a029220Preemptive000001E2BFD9D588:000001E2BFD9F250000001e2be053bb00MTA(ThreadpoolCompletionPort)可以明显的看到是ThreadpoolCompletionPort,没有骗你吧,。二:多线程
相比单线程,多线程用更多的CPU和更多的线程资源换取更快的计算时间,是一种经典的空间换时间策略,代码就不上了,相信多线程大家都快用烂了。三:总结1。多线程比单线程高效的原因就是利用了CPU的多核计算把一个大的任务分而治之从而加速任务计算。2。异步比同步高效的原因是前者释放了调用线程,让调用线程可以做更多的事情而不至于被windows强制休眠浪费线程资源。
刷屏终于,微信能逛淘宝刷抖音了?想必机友们都有碰到这种情况:别人在微信发过来一堆看似乱码的文字,然后提醒我们用淘宝、支付宝、抖音打开。如果我们打开淘宝,会发现分享到微信时,也是自动生成一段神秘代码。……
盒马App卖榴莲被指货不对板!称宣传存误导,将全额退款9月8日,水果猎人知名科普博主杨晓洋发文称,盒马App上销售的黑刺榴莲货不对板,将D13榴莲包装为更为昂贵、稀有的黑刺榴莲。9日,盒马公开致歉,承认误导宣传,并称将与相关部门探……
王者荣耀在线客服在哪?1首先打开王者荣耀来到主页面2在点击右上角的设置的标志3点击了设置后会来到另一个界面4在点击右下方的联系客服5点击联系客服后会弹出一个界面来6在点……
用什么卡流量多又实惠,腾讯大王,米粉还是其他的?我是大伽侃电商,现在市场电话卡太多,至于流量优惠与否还不好说,大多数人喜欢上网,流量就是根本,所以急需一张好的流量卡。移动、电信、阿里、腾讯、小米等,移动的网络比较稳定,……
小米可能是第一个特斯拉FSD授权友商特斯拉FSD要开始授权友商使用了,最有可能短期之内的合作伙伴是小米汽车。很多人说没人会用的。毕竟上汽老总陈虹针对华为提供自动驾驶说过:这好比一家公司为我们提供整体的解决方……
西诚软件拟投资174万对外投资设立控股子公司北能(宁夏)能源挖贝网1月20日,西诚软件(870411)近日发布公告,公司拟对外投资设立控股子公司北能(宁夏)能源科技有限公司,公司拟持股比例为58,注册地为宁夏银川金凤区宁安大街490号I……
屏下旗舰正式确定,三星荣耀是首批,小米全球首发文蜗牛有品说到屏下摄像头手机,作为手机的究极梦醒,一直被关心和热议。从第一代5G手机开始,屏下镜头技术就被提出,因为技术难度大的原因,各家一直憋着不发布对应产品,导致厂商……
电脑上什么浏览器最干净啊?作为一名软件开发人员,最习惯的莫过于谷歌浏览器,也就是Chrome。谷歌浏览器没有各大浏览器这么多广告,纯粹而又实用。个人最喜欢的谷歌浏览器两个功能点:右键极客选择翻译页……
以用户为中心数禾科技的数字化创新求变随着后疫情时代的到来,各行各业都在顺应大众的消费习惯和消费行为的改变,无接触纯线上成为大势所趋,加之互联网的快速蝶变,金融行业也面临着数字化转型的诉求。依托数字化、线上化、远程……
出色的科技实力,好评爆表的口碑5月登顶中国新能源品牌车型销冠,埃安S成为爆款佳作,持续在新能源市场发光发亮。进化,2020款埃安S全新上市,人气拉满,圈粉无数!此次升级,广汽新能源专注在了续航、配置和服务三……
苹果微信合推充值优惠活动羊毛不薅白不薅!近期,微信联合苹果AppStore推出了微信支付充值打9折的优惠活动。首先打开iOS微信,打开后依次点击我支付Q币充值AppStore充值,然后就会……
分享鸿蒙系统一个很实用的功能前几天手机更新了鸿蒙系统,发现还是挺好用的,除了操作流畅,节省空间外,还有很多很实用的功能,今天跟大家分享其中一个图片中提取文字的功能,个人感觉挺实用的。首先打开相册,找……
小米新手机防丢失功能无奈取消虚拟SIM卡规模商用仍在路上每经记者:刘春山每经编辑:张海妮图片来源:每经记者朱万平摄小米近日发布了MIX4新手机,该机作为小米的年度旗舰机,推出了特色功能手机防丢失。但在8月13日晚,小米发……
在京东76元买的东西,店家在拼多多下单28元发货给我,我该怎买卖自由,商品差价是人家找的,只是你自己没找到,如果无理由退货,建议退货。〔笑哭〕电商商家给京东的客户打的标签就是人傻钱多还特别有优越感,就是客户少了点要不然一大群商家都……
骁龙888也有性价比,2K曲面屏无线充电,8256G仅379骁龙888作为目前最顶级的芯片,搭载它的机型通常都不便宜,上到四五千也是常事,但现在已经来到八月份,接下来会有多款旗舰发布,因此也开始慢慢降价了,今天笔者就给大家介绍一款具有极……
如何做好全网营销?全网营销前景如何?自2014年开始至今,短短几年里,我们目睹了人工智能掌管了电脑游戏、控制家庭自动化装置,通过APP解答医学问题。通过社群机器人,文案机器人实现精准营销,通过大数据实现全网的数字……
互联网医疗探究互联网医疗的建设摘要:随着社会发展和政府政策的推动,我国各个行业都展现了互联网金融的身影,互联网金融已经展现出与各行各业深度融合的趋势。在医疗领域,互联网金融金融也有……
小米怎么又想起来做平板了?四五年前在一家饭馆点菜,你大概率会用到平板电脑。它们往往有着刮花的保护膜,磨损的漆面,它们通常都是安卓平板,因此还有个共性:卡顿。电子化点菜曾是平板电脑搞出来的最大花活儿:高端……
精选联盟合作订单管理规则第一章概述为了规范创作者履约行为,保障商家与创作者的合作权益,精选联盟平台推出合作订单管理功能,商家可与合作的创作者就合作商品、合作形式、商品佣金及广告投放等相关事宜达成……
为什么特斯拉刹车不灵但是检测没问题刹车不灵,每次送检,每次都没问题,问题出在哪?软件本文观点来自一个软件工程师的文章,文章找不到了。大神分析中出现各种名词、运行机制啥的表示看不懂,下面仅用个例子来说明一下……
10个国外的视频网站1、YouTube,世界上最大的视频网站。YouTube上拥有各种形式的视频,它提供的服务包括电影频道、视频上传、付费频道、直播、翻译字幕等,因此可以去此网站寻找各种视频影视,……
4个月调整两次!微视与腾讯视频能整出新花样吗?近日,腾讯回应微视大规模裁撤员工为不实消息,并公布了腾讯OVBU(在线视频事业部)新一轮的整合内容。本次调整是将腾讯视频和微视整合进在线视频产品部,原分别归属于腾讯视频与……
想不通腾讯为什么要撤股京东腾讯与阿里,只差一个物流快递了。电商,腾讯少了京东还有拼多多,问题都不大。但是,京东有拼多多没有的京东物流和京东快递啊。目前,快递市场口碑最好的就是,顺丰和京东。而……
vivoS系列全面升级,新增Pro版机型,加快抢占市场节奏不知道从什么时候起,vivo和OPPO的发展路线有了天壤之别,OPPO持续发力线上市场,重新召回一加科技和realme品牌,构建自家完整矩阵,覆盖性价比、主流旗舰和高端旗舰多个……