美文网首页
GCD基本原理

GCD基本原理

作者: 胡智钦 | 来源:发表于2022-04-13 17:50 被阅读0次
    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基本原理

          本文链接:https://www.haomeiwen.com/subject/jjzosrtx.html