GCD
2020-07-22 本文已影响0人
不泯iOS
转自
串行与并发(Serial和Concurrent):
这个概念在创建操作队列的时候有宏定义参数,用来指定创建的是串行队列还是并行队列。
串行指的是队列内任务一个接一个的执行,任务之间要依次等待不可重合,且添加的任务按照先进先出FIFO的顺序执行,但并不是指这就是单线程,只是同一个串行队列内的任务需要依次等待排队执行避免出现竞态条件,但仍然可以创建多个串行队列并行的执行任务,也就是说,串行队列内是串行的,串行队列之间仍然是可以并行的,同一个串行队列内的任务的执行顺序是确定的(FIFO),且可以创建任意多个串行队列;
并行指的是同一个队列先后添加的多个任务可以同时并列执行,任务之间不会相互等待,且这些任务的执行顺序执行过程不可预测。
同步异步代码示例:
/* 1. 提交异步任务 */
NSLog(@"开始提交异步任务:");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/* 耗时任务... */
[NSThread sleepForTimeInterval:10];
});
NSLog(@"异步任务提交成功!");
/* 2. 提交同步任务 */
NSLog(@"开始提交同步任务:");
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/* 耗时任务... */
[NSThread sleepForTimeInterval:10];
});
NSLog(@"同步任务提交成功!");
异步的代码打印完开始提交异步任务:,就打印异步任务提交成功!,不会等待10秒再打印
同步的代码打印完开始提交同步任务:,会等待十秒再继续执行下面的打印操作
串行并行代码示例:
/* 创建一个并发队列 */
dispatch_queue_t concurrent_queue = dispatch_queue_create("队列名称1", DISPATCH_QUEUE_CONCURRENT);
/* 创建一个串行队列 */
dispatch_queue_t serial_queue = dispatch_queue_create("队列名称2", DISPATCH_QUEUE_SERIAL);
*队列的区分就根据创建队列的时候使用的 DISPATCH_QUEUE_CONCURRENT 还是 DISPATCH_QUEUE_SERIAL *