最近表弟一直在找实习,经常会问我一些问题,有些问题在没有经历过真实工作时是真的不好理解的,所以我开了这个【表弟专栏】,专门为找工作的表弟解决一些疑惑。

这篇文章从计算机发展的角度出发,描述为什么计算机需要划分 "主/子线程" 和 "同/异步",希望这个故事你能喜欢。

开天辟地,计算机"老计"诞生

话说几十年前,老计(初代CPU)诞生了,老计诞生初期帮人们解决了诸多繁琐的计算工作,他可以无休无止地按照人们给的指令进行运算。

就像图中一样,人们产生着各种问题,然后把问题丢入到一个队列中去,老计按照人们丢入的指令按顺序进行计算。

但就像现在互联网越来越卷一样,老计工作几年之后,发现要做的事情实在是太多了,有些计算要算完要搞到几十年后了,这可咋办呢?

这时人们认为老计该退休了,换了大计出场,大计的优点是相当卷,计算速度是老计的N倍,大大提升了计算的速度。

现实问题,大计海王进化(主/子线程)

大计有一天在诚诚恳恳工作时,被主管拉到了办公室,开始批评大计:

"大计啊,我知道你工作起来很努力,但你有点死板了啊,所有人给你分配的工作你都是按顺序操作,导致用户说我们的产品就像在挤牙膏,一点点挤出来。你能再加快工作速度吗?不能只靠加班来完成工作啊!"

大计一脸mmp像,心想:“我特么要做什么,不还是你给到的指令啊”,但大计有着当代互联网人共同的目标("保住这份工"),所以大计也只能说:

"好的主管,这事我想想办法,明天给你个答复。"

大计这天工作到凌晨3点,下班后和总线一起去喝酒,说起了白天被主管叼这件事,总线说:

"这事好办啊,我平时给你传的各种指令,优先级不高的你让它不要走同一条路径传输呀,我们像渣男一样搞个高并发!给每个指令都送去温暖,钓住她们,让她们以为你是专一的男人,实际上你在同时和多人交往。"

大计一听直呼妙计妙计,总线不愧是和各个部门打交道的社交花,把泡妞能力用到工作上直接无缝衔接。

之前大计只有一条指令流水线时,他是按走流程,指令1处理完了,才处理指令2,是一个对指令专一的男子。

大计当即画出了这样的指令图:

大计现在能"同时"处理 3条指令:M_0、A_0和B_0,说是"同时",实际上只是大计在这三条指令里频繁切换,M_0完成40%,就去招呼下A_0,A_0处理完80%后,然后再去招呼下B_0指令。

也就是说虽然工作时长是一定的,但给主管一种同时在处理3个指令的错觉。就靠着这套海王策略,大计终于完成了刁钻主管的需求。

不急的话,这事可以等等再做(同/异步)

随着大计海王能力的扩展,现在最高时可以"同时"和几百个指令妹子约会,已经是不可被替代的重要角色,现在主管每天看到大计都得磕个头,大计的话语权也越来越大,甚至开始反过来给主管提需求了:

"主管啊,你可要知道我主线程是负责和用户交互的重要线程啊,你每天在主线程丢那么指令,非常影响用户的体验了啊"

"你有些渲染UI的逻辑太频繁了,导致我做了很多无用的渲染,而且渲染逻辑也分重要程度啊,不重要的指令你等我空闲了再处理啊"

主管连连点头,说好的好的:"我们下次添加指令时,会告诉你这个指令是否需要立刻实施,如果不那么重要可以等你空闲下来再处理。"

于是乎,同步、异步 的概念诞生了:

之前大计在处理 主线程 里的指令时,因为同一个线程指令是没有优先级的概念的,所以 线程里的指令还是按顺序处理的:M_0 -> M_1 -> M_2 -> M_3 -> M_4

但有了 异步 的概念后,假设这里的 指令M_1 不那么重要,那么大计在处理时是可以把 M_1 放到后面处理的:M_0 -> M_2 -> M_3 -> M_4 -> M_1

小结

本篇【表弟专栏】给大家聊了 主/子线程 诞生的必要性,描述了CPU海王本质,以及和同/异步的区别和关联。关于 主/子线程 和 同/异步 的问题,大家可以在评论区一起讨论。最后如果大家喜欢这个专题,可以关注我的公众号:冰以东,会持续更新【表弟专栏】,希望能帮忙大家找到更好的工作。

CPU是海王?聊聊 主/子线程 和 同/异步 的关系的更多相关文章

  1. Android中使用Thread线程与AsyncTask异步任务的区别

    最近和几个朋友交流Android开发中的网络下载问题时,谈到了用Thread开启下载线程时会产生的Bug,其实直接用子线程开启下载任务的确是很Low的做法,那么原因究竟如何,而比较高大上的做法是怎样? ...

  2. GUI(主)线程与子线程之间的通信(用信号槽通讯)

    在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字. 程序截图: 上代码: #include <QtGui> #inc ...

  3. QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽

    在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字. 程序截图: 上代码: #include <QtGui> #inc ...

  4. 2017-11-29 由runnable说起Android中的子线程和主线程

    1.首先纠正一个观点,就是runnable运行在子线程中是错误的观念.runnable只是创建了一个执行任务的对象,但是它本身并不会创建一个新的子线程,Runable只是给你接口让你实现工作线程的工作 ...

  5. Python开发【笔记】:关于子线程(子进程)与主线程(主进程)的关联

    前言: 主要分析下面的问题: 主线程启线程  主线程执行完毕,会关闭子线程吗? 子线程启线程  主线程执行完毕,会结束吗? 主进程启动进程,主进程执行完毕,会怎样? 子进程启动进程,进程执行完毕,又会 ...

  6. c# 子线程如何通知主线程,个人总结

    我要实现的功能如下:程序中有2个线程,主线程和子线程,主线程中有一个变量:X主线程运行中激活子线程,子线程会做出计算改变 X 的值,主线程继续做其它的事,直到 X 的值发生改变时,才会响应,并在tex ...

  7. C#多线程应用:子线程更新主窗体控件的值(二)

    在上篇文章中,我已经给大家列了一个在主线程中实现的方式,这篇文章来给大家说说使用Invoke的方式的例子: 对于不代理不太熟悉的朋友,建议先查查相关资料: 例子一: 在C#中,直接在子线程中对窗体上的 ...

  8. C#多线程应用:子线程更新主窗体控件的值(一)

    我记得以前写过一次关于多线程的调用及更新的文章,由于时间比较久了,现在一时没找到.在做项目的时候,用到了多线程,还是有很多的同事在问多线程更新主窗体的事情,现在就这个事情做个记录. 说起多线程之间的更 ...

  9. [转]MFC子线程更改图像数据后更新主窗口图像显示方法

    程序思路是由外部的输入输出控制卡发出采集图像信号,之后相机采集图像得到图像数据指针,接收图像数据指针创建成图像最后显示到MFC对话框应用程序的Picture Control控件上,同时,为了标定相机位 ...

随机推荐

  1. PHP页面编码问题

    页面编码统一MySQL数据库编码.html页面编码.PHP或html文件本身编码要全部一致.1.MySQL数据库编码:建立数据库时指定编码(如gbk_chinese_ci),建立数据表.建立字段.插入 ...

  2. 修改注册表使win server 2012R2开机进入桌面而不是开始界面

    首先,使用WIN+R快捷键打开运行命令,使用命令打开注册表编辑器 然后,进入注册表之后,我们一次定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ ...

  3. k8s之资源限制以及探针检查

    k8s之资源限制以及探针检查 一.资源限制 1. 资源限制的使用 当定义Pod时可以选择性地为每个容器设定所需要的资源数量.最常见的可设定资源是CPU和内存大小,以及其他类型的资源. 2. reuqe ...

  4. SQL 游标 指针

    DECLARE @radioScoreRate decimal DECLARE @checkScoreRate decimal DECLARE @judgeScoreRate decimal DECL ...

  5. 编译安装haproxy

    一.安装lua环境 1.1 安装依赖包 [root@centos7 ~]# yum install gcc readline-devel 1.2 下线lua源码包并解压 [root@centos7 ~ ...

  6. 深入详解Mybatis的架构原理与6大核心流程

    MyBatis 是 Java 生态中非常著名的一款 ORM 框架,目前在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架. 如果你想要进入一线大厂,能够熟练使用 MyBatis 开发已经 ...

  7. python多版本切换

    环境:Macbook MacOS自带的python2.7,在命令行中输入python后会显示2.7版本 如何切换成新版本? 一.修改用户配置环境变量~/.bash_profile 确定新版本的安装位置 ...

  8. Grafana v8.3.3 & jmeter-influxdb2-backend

    1. 说明 接上篇文章,今天继续聊Grafana & influxdb2-backend. 2. Grafana v8.3.3安装 下载rpm包 wget https://dl.grafana ...

  9. 【摸鱼神器】UCode Cms管理系统 内置超好用的代码生成器 解决多表连接痛点

    一.序言 UCode Cms管理系统是面向企业级应用软件开发的脚手架.当前版本1.3.4.快速体验: git clone https://gitee.com/decsa/demo-cms.git (一 ...

  10. Django数据库与模块models(4)

    上一节做到把一个应用加入到项目中,现在再往里面加一个数据库就可以与数据库进行交互了. Django默认有一个轻量级的数据库叫SQLite,当我们要更换其他的数据库时,则需要绑定数据库,如何绑定?首先打 ...