美文网首页
多线程之GCD概述

多线程之GCD概述

作者: 梦里桃花舞倾城 | 来源:发表于2019-02-28 13:50 被阅读0次

    1.GCD简介

    它是苹果推出的一套多线程解决方案,会合理的利用CPU、自动管理线程的生命周期。使用时只需要在block中写入需要执行的代码即可。非常灵活!

    GCD的源码libdispatch版本很多,源代码风格各版本都有不同,但大体逻辑没有太大变化。libdispatch的源码下载地址在这里

    为什么要用GCD

    • GCD可用于多核的并行运算
    • GCD会自动利用更多的CPU内核(比如双核、四核)
    • GCD会自动管理线程的生命周期(比如:线程创建、线程任务调度、线程销毁)

    2.GCD任务和队列

    任务:

    就是你需要执行的操作(即block代码块里面的内容)。执行任务有两种方式:同步执行异步执行

    • 同步任务sync

      • 当前指令不完成,不会执行下个指令
      • 只能在当前线程中执行任务,不具备开启新线程的能力
    • 异步任务async

      • 可以同时执行多个指令,不需要等待前一个指令完成
      • 可以在新的线程中执行任务,具备开启新线程的能力。

    举个简单例子:你要打电话给小明和小白。

    同步执行就是:你打电话给小明的时候,不能同时打给小白,等到给小明打完了,才能打给小白(等待任务执行结束),而且只能用当前的电话(不具备开启新线程的能力)。
    而异步执行就是:你打电话给小明的时候,不需要等和小明通话结束,还能直接给小白打电话,不用等着和小明通话结束再打(不用等待任务执行结束)。除了当前电话,你还可以使用其他所能使用的电话(具备开启新线程的能力)。

    注意:异步执行(async)虽然具有开启新线程的能力,但是并不一定开启新线程。这跟任务所指定的队列类型有关(下面会讲)。

    队列(Dispatch Queue): 用来存放任务,调度任务。队列是一种特殊的线性表,采用FIFO(先进先出)的原则,即新任务总是被插入到任务的末尾,而读取任务总是从队列的头部开始读取。每读取一个任务,则从队列中释放一个任务。

    GCD中有两种队列:串行队列并发队列。两者都符合 FIFO(先进先出)的原则。两者的主要区别是:执行顺序不同,以及开启线程数不同。

    • 串行队列(Serial Dispatch Queue):
      • 一个接一个的调度任务(只开启一个线程,一个任务执行完毕后,再执行下一个任务)
    • 并发队列(Concurrent Dispatch Queue):
      • 可以同时调度多个任务(可以开启多个线程,并且同时执行任务)

    注意:并发队列的并发功能只有在异步函数(dispatch_async)下才有效

    两者主要区别如下图所示:

    串行队列.png
    并发队列.png
    总结:
    • 开不开线程,取决于执行任务的函数,同步不开,异步才能开。
    • 开几条线程,取决于队列,串行开一条,并发可以开多条(异步)。
    • 串行并发是根据任务来的
    • 同步异步是根据线程来说的

    原文链接

    相关文章

      网友评论

          本文标题:多线程之GCD概述

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