介绍
- 纯C语言实现
- 苹果公司为了多核并行运算提出的解决方案,会自动充分利用设备的多核
- 会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
使用步骤
两个核心
- 任务: 执行什么操作
- 队列: 用来存放任务
GCD的任务
GCD中的任务有两种封装: dispatch_block_t
和 dispatch_function_t
dispatch_block_t
提交给指定队列的block,无参无返回值
1 | typedef void (^dispatch_block_t)(void); |
dispatch_function_t
提交给指定队列的function,void(*)()类型的函数指针
1 | typedef void (*dispatch_function_t)(void *); |
GCD的队列
全局并发队列:一种特殊的并发队列,可以指定服务质量(服务质量有助于确定队列执行的任务的优先级)
全局队列和手动创建的并发队列区别:
- 手动创建的并发队列可以设置唯一标识,可以跟踪错误,而全局并发队列没有;
- 在 ARC 中不需要考虑释放内存,dispatch_release(q);不需要也不允许调用。而在 MRC 中由于手动创建的并发队列是 create 出来的,所以需要调用dispatch_release(q);来释放内存,而全局并发队列不需要;
- 全局并发队列可以指定服务质量(服务质量有助于确定队列执行的任务的优先级);
- 一般我们使用全局并发队列。
死锁
死锁的四大条件
- 互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
- 占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
- 不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
- 循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
GCD 中的死锁
使用dispatch_sync
函数往当前串行队列中添加任务
,会卡住当前的串行队列(产生死锁)