学计算机的那个

不是我觉到、悟到,你给不了我,给了也拿不住;只有我觉到、悟到,才有可能做到,能做到的才是我的.

0%

GCD基础

介绍

  • 纯C语言实现
  • 苹果公司为了多核并行运算提出的解决方案,会自动充分利用设备的多核
  • 会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

使用步骤

两个核心

  • 任务: 执行什么操作
  • 队列: 用来存放任务

GCD的任务

GCD中的任务有两种封装: dispatch_block_tdispatch_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的队列

全局并发队列:一种特殊的并发队列,可以指定服务质量(服务质量有助于确定队列执行的任务的优先级)

全局队列和手动创建的并发队列区别:

  1. 手动创建的并发队列可以设置唯一标识,可以跟踪错误,而全局并发队列没有;
  2. 在 ARC 中不需要考虑释放内存,dispatch_release(q);不需要也不允许调用。而在 MRC 中由于手动创建的并发队列是 create 出来的,所以需要调用dispatch_release(q);来释放内存,而全局并发队列不需要;
  3. 全局并发队列可以指定服务质量(服务质量有助于确定队列执行的任务的优先级);
  4. 一般我们使用全局并发队列。

死锁

死锁的四大条件

  1. 互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
  2. 占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
  3. 不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
  4. 循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。

GCD 中的死锁

使用dispatch_sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)