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