zoukankan      html  css  js  c++  java
  • 第一篇:GCD多线程的概念

    1.什么叫GCD?

    简单来说就是:Grand Central Dispatch的简称,中文翻译就是:”牛逼的中枢调度器“

                        这是纯C语言,还提供了非常多强大的函数

    2.GCD的相对优势:

    (1)GCD是苹果公司为多核的并行运算提出的解决方案

    (2)GCD会自动利用更多的cpu内核(比如:双核 等等)

    (3)GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

    3.注意:

    (1)GCD存在于libdispatch.dylib这个库中,这个调度库包含了GCD的所有的东西,但任何IOS程序,都默认加载在这个库中,在程序运行过程中会动态的加载,不需要我们手动导入。

    (2)GCD是纯C语言的,因此我们在编写GCD相关代码的时候,面对的函数,而不是方法。

    (3)GCD中的函数大多数以dispatch开头。

    4.GCD的任务和队列

    GCD中有两个核心概念:

      (1)任务:执行什么操作

      (2)队列:用来存放任务

    GCD的使用有两个步骤:

      (1)定制任务

      (2)确定想做的事情

    5.要执行的任务

    (1)GCD中有两个用来执行任务的函数

    注意:把右边的参数(任务)提交给左边的参数(队列)进行执行

    <1>如果用同步的方式的话就用:dispatch_sync(dispatch_queue,dispatch_block_t block);

    说明:queue:队列

            block:任务

    <2>如果用异步方法执行任务的话就用:dispatch_asynch_(dispatch_queue_tqueue,dispatch_block_t block);

    重点:同步和异步的区别:

    同步:在当前线程中执行

    异步:在另一条线程中执行

    6.队列

    GCD队列分为两大类型:

    (1)并发队列:可以让多个任务同时执行(自动开启多个线程同时执行任务)并发功能只有在异步的dispatch_async函数下才有效

    (2)串行队列:让任务一个接一个这样执行(一个任务执行完毕后,在执行下一个任务)

    7.并发队列:

    GCD默认已经提供了全局的并发队列,供应使用,不需要手动创建。

    使用dispatch_get_global_queue函数获得全局的并发队列;

    示例:

    dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags)这个参数留给以后用的所以我们传个0。

    第一个参数为优先级,在这里是默认的。获取一个全局的默认优先级的并发队列。

    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAUI,0)这样就可以获取全局并发队列了

    说明:全局并发队列的优先级

    #define DISPATCH_QUEUE_PRIORITY_HIGH 2//高

    #define DISPATCH_QUEUE_PRIORITY_DEFAULT//默认(中)

    #define DISPATCH_QUEUE_PRIORITY_LOW//低

    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN//后天

    8.串行队列

    GCD串行有两种途径:

    (1)使用dispatch_queue_create函数创建串行队列

    dispatch_queue_t dispatch_queue_create(const char *label,dispatch_queue_attr_t attr);//队列名称,队列属性,一般用NULL即可

       示例:

       创建:  dispatch_queue_t queue = dispatch_queue_create("wendingding",NULL);

    非ARC需要释放手动创建的队列:dispatch_release(queue);

     (2)使用主队列(跟主线程有关系的队列)

    主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行。

    使用dispatch_get_main_queue()获得主队列

    示例:

    dispatch_queue_t queue = dispatch_get_main_queue();

    9.说明:

    同步、异步、并发、串行这四个术语是比较混淆的,所以好好注意哦!

    同步和异步决定了是否开启多一条线程:

    同步:在当前线程执行任务,不具备开启新线程的能力

    异步:在新的线程执行任务,就具备了开启新线程的能力

    并发和串行决定了任务的执行方式:

    并发:多个任务执行同时进行

    串行:一个执行完毕后再接着一个执行

    提示:将任务添加到队列中,GCD会自动将队列中的任务取出来,放到对应的线程中并执行。当任务取出后遵循的队列FIFO原则:先进先出,后进后出。

    无论什么队列和什么任务,线程的创建和回收不需要程序员参与,由队列来负责,程序员只需要面对队列和任务。

    GCD在后端管理这一个线程池,GCD不仅决定着Block代码块将在哪个线程中被执行,

    而且还可以根据可用的系统资源对这些线程进行管理,从而让开发者从线程管理的工作中解放出来,

    通过GCD这种集中的管理线程,缓解了大量的线程被创建的问题。

    10.一些队列的执行效果

  • 相关阅读:
    hdu 4710 Balls Rearrangement()
    hdu 4707 Pet(DFS水过)
    hdu 4706 Children's Day(模拟)
    hdu 4712 Hamming Distance(随机函数暴力)
    csu 1305 Substring (后缀数组)
    csu 1306 Manor(优先队列)
    csu 1312 榜单(模拟题)
    csu 1303 Decimal (数论题)
    网络爬虫
    Python处理微信利器——itchat
  • 原文地址:https://www.cnblogs.com/jinchengvs/p/4853320.html
Copyright © 2011-2022 走看看