形象表述多线程

用简单的图示、清晰的语言表述多线程的工作方式。

Posted by Sugar on July 5, 2019

背景介绍:
“软件架构训练计划”以 RT-Thread 和 CubeMX 混合代码为例。
既然用到 RT-Thread 就要了解多线程的编程思想。
本文我就用图示的方式形象表述一下多线程的工作方式。

先看一下 RT-Thread 线程组成

可以先不看文字,记住这 3 个圈的样子就行。

将人比作CPU

多线程的工作方式

假设一个人到某处办事,要走 3 个窗口(相当于 3 个线程)。
3 个窗口各司其职、互不相干、完全独立。

  • 人一进门,正好所有窗口都在正常服务状态。

  • 交流后,第一个窗口忙起来了。

  • 各窗口都跑一遍,所有窗口都忙起来了。

  • 事没办完,各窗口都在进行中,人闲下来了(相当于 CPU 的 idle 线程)

  • 当时间到了,或有窗口呼叫时,人要立即赶去目标窗口(相当于退出 idle 线程)

总结

  • 人办事要走 3 个窗口,相当于软件按需划分成 3 段程序(也称为 3 个线程)。
  • 各个窗口相互独立,相当于各线程互不相干。
  • 人空闲下来,相当于 CPU 进入 idle 线程。
  • 人重新回到某个窗口,相当于 CPU 切换到工作线程。

这个比喻与实际不符的地方

对于单核的单片机,是 CPU 在做事。这个比喻中每个窗口都有“工作人员”,而实际上更合适的图示是:只画 3 个窗口,每个窗口只写“窗口职能和做法”,要办事的人自己去做事。(但这样画图就与实际生活中办事的情况不一样了,就不太好理解。因此,图示折中的地方是:所有“工作人员”都没有画出眼耳口鼻,只画个脸,表示是个假设的人。)

引用野火书里的一段文字

[野火®]《RT-Thread 内核实现与应用开发实战—基于STM32》

多线程对编程思想的影响

  • 线程内不要担心 while(1) 会死循环。 就好像是上面各个窗口都是常年累月的在各自的职责里无限循环。
  • 不要担心 RTOS 的 delay() 函数会影响整个程序的执行。 就好像某个窗口的“工作人员”上个厕所,其余窗口的人该做啥做啥,不会所有人一起停掉正在做的事情而去等那个不相干的上厕所的人归位。

关注作者

欢迎扫码关注我的公众号MultiMCU EDU

提示:在公众号“关于我”页面可加作者微信好友。

请我喝杯咖啡如何?

微信 weixinfukuan 支付宝 zhifubaofukuan