问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

一个高频问题:异步操作会创建线程吗?

发布网友 发布时间:2022-09-18 03:44

我来回答

1个回答

热心网友 时间:2023-10-20 02:26

这个问题在微信上被别人问过好多次,想来想去觉得有必要统一解答下,先说下我的答案: 可能会,也有可能不会

要想寻找答案,需要从 异步处理 的底层框架说起。

异步 从设计层面上来说它就是一个 发布订阅者 模式,毕竟它的底层用到了 端口完成队列 ,可以从 IO完成端口内核对象 所提供的三个方法中有所体现。

可以粗看下签名:

这个方法主要是将 文件句柄 和 IO完成端口内核对象 进行绑定,其中的 NumberOfConcurrentThreads 表示完成端口最多允许 running 的线程上限。

再看签名:

这个函数的作用就是将一个 包 通过 内核对象 丢给 驱动设备程序 ,由后者与硬件交互,比如 文件 。

看签名:

这个方法尝试从 IO完成端口内核对象 中提取 IO 包,如果没有提取到,那么就会无限期等待,直到提取为止。

对上面三个方法有了概念之后,接下来看下结构图:

这张图非常言简意赅,不过只画了 端口完成队列 , 其实还有三个与IO线程有关的队列,分别为: 等待线程队列 , 已释放队列 , 已暂停队列 ,接下来我们稍微解读一下。

当 线程t1 调用 GetQueuedCompletionStatus 时,假使此刻 任务队列q1 无任务, 那么 t1 会卡住并自动进去 等待线程队列 ,当某个时刻 q1 进了任务(由驱动程序投递的),此时操作系统会将 t1 激活来提取 q1 的任务执行,同时将 t1 送到 已释放队列 中。

这个时候就有两条路了。

如果 t1 在执行的时候,遇到了 Sleep 或者 lock 锁时需要*停止,此时系统会将 t1 线程送到 已暂停线程队列 中,如果都 sleep 了,那 NumberOfConcurrentThreads 就会变为 0 ,此时就会遇到无人可用的情况,那怎么办呢?只能让系统从 线程池 中申请更多的线程来从 q1 队列中提取任务,当某个时刻, 已暂停线程队列 中的线程激活,那么它又回到了 已释放队列 中继续执行任务,当任务执行完之后,再次调用 GetQueuedCompletionStatus 方法进去 等待线程队列 。

当然这里有一个问题,某一个时刻 等待线程队列 中的线程数会暂时性的超过 NumberOfConcurrentThreads 值,不过问题也不大。

说了这么多理论是不是有点懵, 没关系,接下来我结合 windbg 和 coreclr 源码一起看下。

以我的机器来说, IO完成端口内核对象 默认最多允许 12 个 running 线程,当遇到 sleep 时看看会不会突破 12 的*,上代码:

从图中看,已经破掉了 12 的*,那是不是 30 呢? 可以用 windbg 帮忙确认一下。

从最后一行看,没毛病, IO完成端口线程 确实是 30 个。

所谓的耗时操作,大体上是大量的序列化,复杂计算等等,这里我就用 while(true) 模拟,因为所有线程都没有遇到暂停事件,所以理论上不会突破 12 的*,接下来稍微修改一下 GetString() 方法。

对比图中的时间,过了30s也无法突破 12 的*,毕竟这些线程都是 running 状态并都在 已释放队列 中,这也就造成了所谓的 请求无响应 的尴尬情况。

如果明白了上面我所说的,那么 异步操作会不会创建线程 ? 问题,我的答案是 有可能会也有可能不会 ,具体还是取决于上面提到了两种 callback 逻辑。

本文来自https://www.cnblogs.com/huangxincheng/p/16085461.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ccie安全到底是讲些什么 血型亲子鉴定原理是什么? 亲子医学鉴定的方法是什么?? 厦门劲草信息科技有限公司怎么样? 河北劲草信息科技有限公司怎么样? 老公妈妈去世了,带的孝帕被老公带回家,影响吗? ...值和劳动定额有什么区别?敢请高手赐教,越详细越好!谢谢! WPS教程怎么取消打印预览分割线 西安的消费水平是高吗? 西安的消费水平怎么样 如何实现异步调用 怎么样可以控制食欲,我只要一无聊,嘴巴就停不下来 为什么我一吃花生嘴巴就停不下来?刚刚买的花生,不知不觉就吃了三分之一。 我成了一个大吃货、见什么吃什么感觉什么都好吃,嘴巴根本停不下来、莪估计是缺少什么? 明明已经吃很饱了,还要不停吃东西,嘴巴停不下来,怎么办,如果饿着一点东西都不想吃,哎,怎么让自己停 一加手机好不好抢 一加手机怎么在实体店买不到 一加手机3难抢吗?一次大概多少部? 为什么网上抢手机总是抢不到?怎样可以每次都抢到呀? 网上很多人都说一加手机好,就是抢不到,请问好在哪里? 绒毛的医学含义 新缸开缸一个星期水面起泡,该怎么处理 水族箱里总有一层泡沫怎么去除? 大叶松果花卉的养殖方法? 鱼缸打氧起沫,像洗衣粉的沫! 北京的生活超市物美 和 超市奥士凯物美 是什么关系? 为什么天津的好多超市都换成了物美生活超市 秦皇岛市物美超市和北京的物美超市是一家吗? 物美超市是世纪联华超市吗? 如何区分物美是超市还是商场 大沽河发源地 大沽河入海口具体地点 济南安博实验室通用设备有限公司的英文? 济南双行机电设备有限公司怎么样? 济南鼎通升降机械有限公司怎么样? 幽门螺杆菌是如何使人感染的? 空气清新剂里面有个双面胶贴,请问是用来干嘛的啊???知道的说一下,谢谢 有学过十方融海音乐制作课程的吗 谈一谈音乐制作技术手段的发展对我们这些专业从业者和学习者+对而言有怎样的? 音乐生舞蹈课要学什么? 一直对音乐制作有些技术上的疑问…… 练瑜伽没出汗可以化妆吗 大闸蟹5斤装的多少钱 阳澄湖大闸蟹礼券 大闸蟹多少钱一斤 第一个什么意思?连起来了吗? 男朋友说我是他的第一个也是最后一个,这句话是什么意思?(他在我之前谈过恋爱) 身上有异味,臭得很怎么办 慈溪机关事业单位工资低 2020年慈溪市*公选公招的卫技人员签订的是聘用合同是属事业编制的吗? 请问传祺GM6玻璃水加多少