GCD基本原理

GCD(Grand Central Dispatch)简介
  1. 纯C语言,函数(异步dispatch_async同步dispatch_sync
  2. 优势:(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(), ^{});

你可能感兴趣的:(GCD基本原理)