中枢调度器 多核并行运算解决方案
两个核心概念 任务 和 队列 其中队列存放任务 任务的取出遵循队列的先进先出,后进后出的原则
1.sync 和 async
其中同步和异步 主要影响作用于是否能开启新线程
同步在当前线程中执行,不具备开启新线程能力,
异步可以在新的线程中执行,具备开启新的线程能力
2.serial 和 concurrent
并发 既允许多个任务同时执行 (只在异步队列中有效)
串行 既多个任务顺序执行
3.concurrent
--1.使用 dispatch_queue_create 函数创建队列
--2.GCD默认已经提供了全局的并发队列 供整个应用实用,无需手动创建
--3.同步线程 + 并发队列
不会开启新的线程 串行 没有线程谈和并发
4.serial
--1.创建串行队列
--2.特殊的串行队列 主队列
只要是主队列 无论是同步函数还是异步函数 都在主线程中执行
--3.异步线程 + 串行队列
开辟一条子线程并顺序执行
--4.同步线程 + 串行队列
在主线程中 顺序执行
--5.同步线程 + 主队列
若当前线程为住线程 会导致线程阻塞,知道内存溢出崩溃
因为执行log1 后的代码相当于一个任务A 该任务A在主队列中顺序执行,
而
任务A 中的sync 会立即执行 相当于任务B 也会立即执行
无法确定A 更优先 还是B更优先 则导致 线程阻塞
可以归纳为
使用同步线程 向 当前串行队列中添加任务 会导致线程阻塞
若当前线程不是主线程 则会 回到主线程中顺序执行
5.GCD线程间的通讯
6.GCD其他常用函数
--1._barrier 系列 除了async 还有sync
但是queue 不能是全局并发队列
dispath_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
在全局并发队列中 barriaer 无效
--2.快速迭代器 apply
7.队列组
--1.创建一个队列组
dispatch_group_tgroup =dispatch_group_create();
--2.将多个需要执行的任务添加进队列组中
--3.等待队列组中所有的任务结束调用notify
--4.调用结果
调用添加进队列组内的两个异步多线程任务 直到完成后调用notify方法 最后同步住线程完成操作
8.利用GCD实现一个单例
+(void)alloc 调用alloc zone 方法 所以封死zone 方法 最靠谱
若需要copy该对象,则肯定首先有对象,所以直接返回static 对象即可