1. 简述GCD:
- 是一种基于C的多核编程技术,主要用于优化应用程序以支持多核处理器.
- 提供多线程开发函数, 提供了性能和功能.
- 具有一定的代码段(一般是一个block或者函数).
- 以队列的方式进行工作, FIFO
- GCD会根据并发队列的类型, 创建合适数量的线程执行队列中的任务.
2. GCD中两种队列:
- Serial: 串行队列
$一次只执行一个任务.通常用于同步访问特定的资源或数据.
$当创建多个串行队列时, 虽然它们各自是同步执行的, 但是队列之间是并发执行的.
- Concurrent: 并行队列
$可以并发地执行多个任务, 但是遵守FIFO原则.
3. GCD的误区:
就GCD中的串行并行队列, 同步异步任务, 在使用过程中总会混淆, 看到该段注释豁然开朗:
串行和并行与同步异步执行的问题,串行并行决定了对列中任务的执行规则(循序)串行队列队列里面的任务循序执行,并行队列根据系统资源而定,没有一定的规则。并且给我们的感觉是多个任务同时执行。异步和同步只是GCD里面对任务block的处理问题,同步忽略block代码循序执行,异步却是正常的block逻辑,及某一时刻进行回调,而且是先进队列咧线回调(在串行队列里)。
文/二龙湖没有浩哥(简书作者)
原文链接:http://www.jianshu.com/p/1c46ccb7821a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
4. 两种队列代码示例:
#pragma mark --------- GCD串行队列 --------
//1. 创建系统提供的串行队列(主队列)
#将主队列添加同步任务中, 会出现线程锁死的情况: 因为是主线程,所以异步任务也会在主线程上运行。而如果是同步任务,则阻塞了,因为主线程一直会在运行,所以后米的任务永远不会被执行。
dispatch_queue_t queue1 = dispatch_get_main_queue();
//2. 创建一个串行队列(一个系统队列)
//参数一: 系统提供的宏
//参数二: 系统保留字段 0
dispatch_queue_t queue2 = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, 0);
#pragma mark --------- GCD并行队列 --------
//1. 创建系统提供的并行队列(全局队列)
//参数一: 表示队列的优先级(四个)
//参数二: 系统保留字 0
dispatch_queue_t queue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
//2. 自己创建一个并行队列
//参数一: 表示队列的名字
//参数二: 系统提供的宏
dispatch_queue_t queue4 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
5. 将任务添加到队列中
#pragma mark --------- 将任务添加到队列中 ----------
//串行队列 + 同步任务
dispatch_sync(queue1, ^{
NSLog(@"同步+串行");
});
//串行队列 + 异步任务
dispatch_sync(queue2, ^{
NSLog(@"异步+串行");
});
//并发 + 同步
dispatch_sync(queue3, ^{
NSLog(@"并发 + 同步 %@", [NSThread currentThread]);
//同步任务, 在主队列中完成, 不会开辟子线程
});
//并发 + 异步
dispatch_async(queue4, ^{
NSLog(@"并发 + 异步 %@", [NSThread currentThread]);
//异步任务, 会开辟自己的子线程
});