海树

导航

关于多线程的理解

作者:岳先生
链接:https://www.zhihu.com/question/22375509/answer/121198057
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

为了讲清楚多线程编程,这儿先讲一个场景。

这个场景是这样子的,山上有座庙(进程),庙里住了很多小和尚和老和尚(线程),当然隔壁山上也有很多尼姑妹子。小和尚和老和尚们每天都需要下山挑水喝。这些个和尚有刚上山的(就是有点傻的),有比较聪明的,也有闹过矛盾的。场景,人物呢,大概就是这么个样子。


俗话说的好,有人的地方就有江湖。这些个小和尚,老和尚都不是很安分,为了每天的这个挑水工作闹了很多很多的矛盾,也犯过很多傻。


下面对挑水工作所有发生的情况做个详述:

1)刚上山的小和尚挑水,就是比较傻的那个,和别人都不认识,每天挑水都自己一个人,一次挑一桶水,一天下来发现挑的水根本不够喝。(串行

2)和尚里面有个力气大的,和别人关系不好,每次挑水能挑三桶左右,一天下来,发现挑的水勉强够喝。 (并发

3)和尚里面有几个关系好的,力气也比较大,每次挑水都一起去,每个人都能挑两桶左右,一天下来,发现挑的水不仅够喝,还有时间帮隔壁山尼姑妹子挑水。 (并行

4)在水井里打水,有个专门的妹子负责打水,比较傻的那个小和尚每次都盯着打水的妹子,还随时随地看水桶装满没有(同步);当然,有傻的,也有聪明的,这个聪明的和尚在妹子打水的时候,就乘机在一旁休息,水打满以后,妹子都过来告诉他。(异步

5)水井里有一天没水了,傻和尚看见水井里没水以后,在水井边上一直等着,等有水了再挑回去(阻塞);聪明和尚呢,看见水井里没水了,一点都不犹豫的回去了。(非阻塞

6)又有一天,那闹过矛盾的两个和尚挑水,正好狭路相逢,谁也不让谁过去,一直僵持着。(死锁

7)寺庙里厨房空间有限,每次只能进去一定数量的和尚,当厨房满了以后,其他人只能在外面等着,直到里面的人出来。这个实现的方法是,厨房门口挂了很多锁,每个人进去以后都拿走一把锁,出来以后把锁挂上,这样外面的人就可以知道厨房里面人满没满。(信号量


终于编完了。。。

通过上面生动形象的描述,这个线程里面的一些概念已经明白了。


下面解释下多线程。

还是上面的例子,在这个寺庙里面,如果每天都由那个新来的傻子和尚挑水喝,肯定是不行的,有的喝没得喝咱且不说,你让他累死了咋整。何况寺庙里那么些个空着的水桶那么些个不干活的人闲着也是闲着。

所以多线程的意思就是多个线程一起去协同完成一个任务,通过充分去共享资源来达到提升效率的一种编程思想。

当然,在这个过程中会遇到很多麻烦,比如会碰上死锁的问题,同时去争抢同一个资源的问题等等。

为了解决这个问题,iOS里是使用加锁这个方法避免,当然,使用锁,会在一定的程度上印象执行的效率,我们需要在效率和安全之间寻找一个平衡点。

posted on 2017-08-07 21:21  海树  阅读(231)  评论(0)    收藏  举报