多线程和蕃茄炒蛋

今天刚毕业的新人问我关于多线程的问题,因为我也没有理解透彻,一时没有解释清楚,现在细想类比蕃茄炒蛋,整理了下:

IIS是一个天生的多线程程序。
好比,一个订单请求过来,就放出一个厨师做蕃茄炒蛋,再来一个新订单,再放一个厨师出来做蕃茄炒蛋。厨师做完菜,就回房休息。
因为是多个CPU,多核,可以安排N个厨师同时干活。每个厨师参照同一份菜谱(程序代码)做菜,各自记下自己的步骤。
如果还是嫌上菜速度太慢,那就要修改菜谱,原来的菜谱是对针对一口锅写的,现在我们拿来两口锅。
原来的菜单类似于这样:
第一步:准备好一只蛋,和一只蕃茄。
第二步:把蛋放在锅里烧1分钟+,起锅拿出蛋。
第三步,把蕃茄放在锅里烧1分钟+,混入炒蛋。
第四步,翻炒1分钟后起锅。

改进后的新菜单类似于这样:
第一步:准备好一只蛋,和一只蕃茄。
第二步:同时点火两口锅,分别放入蛋和蕃茄,各烧1分钟+。
第三步,看蛋先熟还是蕃茄先熟,先熟的食材的锅先安排熄火。
第四步,待慢热的另一个食材也烧熟后,将两种食材混和翻炒,然后起锅。

现在每个厨师拿到新的菜谱后开工,工作效率明显提升了,每份蕃茄炒蛋大约省下1分钟的时间。

值得注意的是,厨师们还是只参考同一份菜谱,并没有各自复印,但他们各自干活时会记下各自的工作进度(指令指针和私有变量)。
两口锅工作时,锅里的食材不一样,进度不一样,但是还是参考同一份菜谱,各自关注锅内食材的成熟度(指令指针和私有变量)。
厨房的排风扇,水龙头,电灯,燃气,是所有人共享的。
电灯大家都用,下班后最后走的那个人关灯,不会冲突,没有问题。
燃气分别为每口锅各自提供接入,各自开关,不会冲突,没有问题。
水龙头每个人都要用到,而且一个水龙头大家共用,只能一个人接水,这就很容易发生水资源抢占的问题。
最糟糕的情况时,我正准备接水的时候,别人高处截流,导致我一直接不到水,结果鸡蛋炒糊了,油锅都起火了,这就很不安全了。
所以多线程程序会额外引入资源分配,线程同步的问题。
通常的做法是,协调好厨师们用水的方式,比如约定排队取水,先到先得,用完即走。

posted @ 2019-07-26 20:56  heguo  阅读(137)  评论(0编辑  收藏  举报