多线程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 实现响应式,数据回调

 

 

 

原文地址:https://www.cnblogs.com/coolcold/p/12194537.html