• 关于多线程中GCD的使用


    GCD 分为异步和同步

    异步:
    ```objc
     dispatch_async (  参数1  , {
         }
    同步:
    dispatch_sync( 参数1   , {
     
    }
    ```
    ###参数1 :队列
     
    队列分为两种:  **dispatch_get_globle_queue(0,0) **全局队列**dispatch_get_main_queue()**主队列
     
    全局队列  : 系统为程序员提供的队列 
    执行时机 : 在系统主线程空闲时才会执行
    主队列: 系统在执行主线程时执行
    执行时机 :一般从分线程跳转到主线程需要使用 主队列
     
    全局队列和异步配合使用
    主队列和同步配合使用
     
    补充:其中队列还包含自己创建的 **dispatch_queue_creat **( 参数1  , 参数2   )出来的
    其中
    参数1是 队列的名字标识 
    参数2 有两个选择 
    ```objc
     a.   DISPATCH_QUEUE_SERIAL  //是该队列是一个串行队列 即有序执行 
    b.  DISPATCH_QUEUE_CONCURRENT  //该队列是一个并发队列,在执行第一个的同时会不等前一个队列执行完,就会在其他线程中执行后一个队列或者其中的其他队列 (无次序之分)
    ```objc
    #面试题
    ```objc

    - (void)viewDidLoad {

    //dispatch_sync(dispatch_get_main_queue(), ^{
    //NSLog(@3);
    //死锁原因
    //1:dispatch_sync在等待block语句执行完成,而block语句需要在主线程里执行,所以dispatch_sync如果在主线程调用就会造成死锁
    //2:dispatch_sync是同步的,本身就会阻塞当前线程,也即主线程。而又往主线程里塞进去一个block,所以就会发生死锁。
    //});
    //dispatch_async(dispatch_get_global_queue(), ^{
    //async 在主线程中 创建了一个异步线程 加入 全局并发队列,async 不会等待block 执行完成,立即返回

    NSLog(@2);//不会造成死锁;

    });

    }

    ```

    **分析这段代码:view DidLoad 在主线程中,也即dispatch_get_main_queue()中,执行到sync时向dispatch_get_main_queue()插入同步thread,sync会等到后面的block执行完成才返回。sync又在主队列里面,是个串行队列,sync是后面才加入的,前面一个是主线程,所以sync想执行block必须等待前一个主线程执行完成,而主线程却在等待sync返回,去执行后续工作,从而造成死锁。**

    ###2:

    ```objc

    dispatch_sync 和 dispatch_async 区别:

    dispatch_async(queue,block) async 异步队列,dispatch_async 函数会立即返回, block会在后台异步执行。
    dispatch_sync(queue,block) sync 同步队列,dispatch_sync 函数不会立即返回,即阻塞当前线程,等待 block同步执行完成。

    ```

    3:

     ```objc

    GCD Queue 分为三种:

    1,The main queue :主队列,主线程就是在个队列中。

    2,Global queues : 全局并发队列。

    3,用户队列:是用函数 dispatch_queue_create 创建的自定义队列

    ```

    追寻最真
  • 相关阅读:
    C++ 并发编程 01 线程api
    C# CS1591 缺少对公共可见类型或成员的 XML 注释 问题解决
    Web Api HelpPage
    C++11新特性介绍 02
    C++11新特性介绍 01
    Autofac框架详解
    Linux gdb调试器用法全面解析
    BCM_SDK命令
    VLAN
    java_Observer Design Pattern
  • 原文地址:https://www.cnblogs.com/zhao-jie-li/p/5128467.html
Copyright © 2020-2023  润新知