GCD基本原理
2022-04-13 本文已影响0人
胡智钦
GCD(Grand Central Dispatch)简介
- 纯C语言,函数(
异步dispatch_async
、同步dispatch_sync
) - 优势:(CPU)多核并行运算,自动创建、调度、销毁
GCD 函数
异步dispatch_async
- 不用等待当前语句执行完毕
-
会开启线程
执行block的任务 - 异步是多线程的代名词
同步dispatch_sync
- 必须等待当前语句执行完毕
不会开启线程
- 在当前线程执行block任务
队列(FIFO)
串行队列
- DQF_WIDTH = 1
同步串行
1. 不会开启线程,在当前线程执行任务
2. 任务串行执行,任务一个接着一个
3. 会产生堵塞
异步串行
1. 开启一条新线程
2. 任务一个接着一个
并发队列
- DQF_WIDTH = MAX
同步并发
1. 不会开启线程,在当前线程执行任务
2. 任务一个接着一个
异步并发
1. 可能会开启新线程或用已存在的线程,在当前线程执行任务
2. 任务异步执行,没有顺序,CPU调度有关
队列的几种类型
串行(DISPATCH_QUEUE_SERIAL)
并发(DISPATCH_QUEUE_CONCURRENT)
主队列(dispatch_get_main_queue 串行队列)
全局队列(dispatch_get_global_queue 并发队列)
函数说明:
dispatch_sync // 同步
dispatch_async // 异步
dispatch_queue_t // 主要分为两种,串行、并行
dispatch_queue_create("concurrent_queue",DISPATCH_QUEUE_CONCURRENT); // 并发
dispatch_queue_create("serial_queue", DISPATCH_QUEUE_SERIAL) // 串行
dispatch_once_t // 代码只会执行一次,用于单例
dispatch_after; // 延迟操作
dispatch_get_main_queue(); // 回到主队列线程操作
dispatch_get_global_queue(0, 0); // 全局队列
dispatch_semaphore_create(2); // 创建2条信号量
死锁
死锁情况① :异步串行 中的进行同步block任务会死锁
dispatch_queue_t queue = dispatch_queue_create("xx", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"1");
dispatch_sync(queue, ^{
NSLog(@"2");
});
NSLog(@"3");
});
死锁情况②:主队列同步block任务 会死锁
dispatch_sync(dispatch_get_main_queue(), ^{});