GCD 多线程 Ios 补充

一条线程在一个队列中(队列中有多个任务):任务是一个一个执行,执行完这个才能执行下一个任务.

你在第一个block没有执行完的时候就添加了第二个block,所以就死锁了.进入第一个打印的时候当前队列是:queue,进入第二个打印的时候当前队列也是:queue,同步执行就是死锁.配合我前面的死锁文章好好理解一下.

这样就不是死锁

进入第一个打印的时候当前队列是:queue,当执行完第一个打印 的时候,当前队列是主队列,3031行之间加一次打印你就会看到:是主线程主队列的打印,进入第二次打印的时候,当前队列是queue,虽然是一个队列,但是中间是有队列切换的:主队列和queue之间的切换.自己多理解吧,说多了也没用.

下面的也不是死锁

这是两个线程合作完成,一个队列中的多个任务.线程配合对列的使用情况很复杂,队列中可以开线程

线程中有可以创建队列,也不能说清楚所有的情况,懂了基本的原理之后还是要具体情况集体分析.

这个东西搞多了会死人的,感觉前两篇关于多线程的文章写的好像还是有问题的.改天看一下.有一段时间整不明白的时候看见一个程序就是死锁,看见一个就是死锁根本没办法写代码,能理解那中状态么,都是死锁死锁.要疯了

还是补充一下吧:

什么是当前队列,就是说这个队列在执行着,你在正执行的队列中添加任务就是死锁了.当前队列和同一个队列要区分开:一个队列被线程正在执行这是当前队列,为什么同一个队列在下面的情况就不会死锁,30---26行这段代码执行时,当前队列就是queue,过了30行是要回到主队列的,queue这个队列不是正在执行的队列,不是当前队列,31行的时候又切换了一次队列,

主队列-->queue-->主队列-->queue-->主队列

如果你在某个正在执行的队列中同步添加任务会死锁

又来补充一下:

在这里自己吃了好多苦头:希望你们可以轻松一点:

一时间我找不到很好的比喻来说这个事情,就拿高中生物学得知识来比喻一下:排尿过程

(话有点糙,我是为了说明这个知识点,用词可能不大准确也不大好…)

我们知道人在排尿的时候膀胱是关闭的,尿液是不能进入膀胱的,膀胱就相当于队列,尿液就相当于队列中的任务,当正在排尿的时候,其他任务是没法进入的,你以为你已经添加到队列当中了,实际上并没有,类比撒尿的过程,如果你一直处于一个状态你是尿不完的,因为膀胱(队列)是关闭的,只有再次开启,任务进来然后再执行.要切换一下队列的状态,执行的时候你可以理解为,队列就关闭了,不能添加任务,当执行完毕的时候,队列开启,任务才能添加进去.所以撒尿的过程最后的状态是一停,一停的….如果我前面写的多线程加锁你理解好,这篇文章一定没有问题,加锁的问题类比到这里就是:有很多鸡鸡(多线程)抢夺资源(尿液),死锁就是:资源(尿液)抢夺线程(鸡鸡).

算了我说不下去了,自己脑补一下吧.懂就懂不懂就算了.写得我小脸通红….干人~~~

posted @ 2015-11-14 20:47  LDSmallCat  阅读(173)  评论(0编辑  收藏  举报