多线程GCD(二)

 

GCD

 

 

 

 

 

 

 函数

 

队列:

 

 

 

 

 

队列和函数

 

 

 

 

 

 

 

 

 

 

这里崩溃的原因是死锁:(相互等待执行完成)

串行队列里面添加的顺序是:2 - block - 4 - 3

因为是串行队列,所以4 的执行需要等待block执行,block执行完成依赖于3,3又要等待4执行完毕,所以造成死锁。

 

队列:

队列的特征是FIFO,并发队列也是先进先执行,只是不会等待一个任务执行完毕才执行下一个。

 

 

 

 

//1. 通常的多个请求处理方法 

 

 

//2. 使用全局队列,阻塞主线程

 

 

//3. 使用任务的形式封装多个网络请求,不会阻塞主线程,可以执行其他的事情

 

 

#pragma mark - 栈栏函数:dispatch_barrier_sync/dispatch_barrier_async (这里需要注意一个问题,就是栈栏函数一定要在自己创建的队列,不然没有效果,因为如果连全局队列也阻塞的话,系统就停止了,系统如果停止,那么也就没有意义了。)

 

 

 

 

因为多线程导致的signal崩溃,线程BUG,很多线程去操作,但是操作不过来

 

 

 

解决方式:加@synchronized锁

 

或者:dispatch_barrier_sync栈栏函数

 

 

 栈栏函数总结:

//    栈栏函数:

//    1. 保证顺序执行

//    2. 保证线程安全

//    注意点:

//    3. 一定要是自定义的并发队列

//    4. 不是非常优秀

//    5.如果是dispatch_barrier_async只阻塞当前的自定义并发队列,这种就不是很友好,因为别人在使用你的时候,不知道你是封装到一个队列中的,就完成不了顺序执行了,会出现问题,过度依赖于一个队列了,不利于封装。

 

 

调度组:队列随便选,想在哪个队列执行就在哪个队列执行,就是不依赖与队列

 

 

 

 

 

调度组的入组和出组必须成对的存在

 

 

信号量控制并发数:

 

 

 

 

 

 diapatch_source:

 

 

 

runlooprun 里面用到了一部分dispatch_source,在判断超时的时候

 

 

 

 

 

dispatch_source 实现响应式,数据回调

 

 

 

 

 

 

 

 

posted @ 2020-01-14 23:03  do+better  阅读(169)  评论(0编辑  收藏  举报