• GCD多线程的使用(二)


            记录一下GCD的几个重要API的用法。

            dispatch_queue_create

     * @param label
     * A string label to attach to the queue.
     * This parameter is optional and may be NULL.
     *
     * @param attr
     * DISPATCH_QUEUE_SERIAL or DISPATCH_QUEUE_CONCURRENT.
     *
     * @result
     * The newly created dispatch queue.
    dispatch_queue_t
    dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);

            用来创建Dispatch Queue,返回值类型是dispatch_queue_t,这个方法需要传递两个参数,label是附加到queue上的一个字符串标签,这个参数是可选的,并且有可能为空,这是queue的名字,在进行调试的时候会很方便,所以推荐在创建Dispatch Queue的时候传一个标签。获取一个queue的名字的方法如下:

    /*!
     * @function dispatch_queue_get_label
     *
     * @abstract
     * Returns the label of the given queue, as specified when the queue was
     * created, or the empty string if a NULL label was specified.
     *
     * Passing DISPATCH_CURRENT_QUEUE_LABEL will return the label of the current
     * queue.
     *
     * @param queue
     * The queue to query, or DISPATCH_CURRENT_QUEUE_LABEL.
     *
     * @result
     * The label of the queue.
     */
    const char *
    dispatch_queue_get_label(dispatch_queue_t queue);

            第二个参数attr是用来指定创建的Dispatch Queue的类型,DISPATCH_QUEUE_SERIAL或者NULL表示创建串行Dispatch Queue,DISPATCH_QUEUE_CONCURRENT表示创建并行Dispatch Queue。其实创建串行的参数DISPATCH_QUEUE_SERIAL就是NULL,源码如下:

    /*!
     * @const DISPATCH_QUEUE_SERIAL
     * @discussion A dispatch queue that invokes blocks serially in FIFO order.
     */
    #define DISPATCH_QUEUE_SERIAL NULL

       FIFO,即First in first out,先进先出。

            关于创建的两种Dispatch Queue类型,Serial Dispatch Queue同时只能执行一个追加处理,Concurrent Dispatch Queue能并行追加多个处理,虽然这两种Dispatch Queue受到系统资源的限制,但用dispatch_queue_create函数可以生成任意多个Dispatch Queue。当生成多个Serial Dispatch Queue时,各个Serial Dispatch Queue并行执行,虽然在一个Serial Dispatch Queue中同时只能执行一个追加处理,但如果将处理分别追加到4个Serial Dispatch Queue中,各个Serial Dispatch Queue执行一个,即同时执行4个处理。也就是一旦生成Serial Dispatch Queue并进行追加处理,系统就要对这个Serial Dispatch Queue生成且只生成一个线程,如果生成多个Serial Dispatch Queue,那么系统就生成多个线程。

            虽然能生成多个线程,但是决不能滥用Serial Dispatch Queue,因为如果过多的使用线程,会消耗大量的内存,引起大量的上下文切换,大幅度降低系统的响应性能。所以建议只在为了避免多个线程更新相同资源导致数据竞争时使用Serial Dispatch Queue。

            当想并行执行不发生数据竞争问题的处理时,使用Concurrent Dispatch Queue,对于Concurrent Dispatch Queue来说,不管生成多少,由于XNU内核只使用有效管理的线程,因此不会发生Serial Dispatch Queue的那些问题。

            另外,通过diaptch_queue_create函数生成的Dispatch Queue在使用结束后需要通过dispatch_release函数来释放。

    dispatch_release(queue);

            相对应的,GCD也有retain操作,dispatch_retain函数就是增加引用计数的。GCD中得Dispatch Queue也像Objectiv-C的引用技术式内存管理一样,需要通过dispatch_retain和dispatch_release的引用计数来管理内存。

    最后推荐一个非常好的博客:唐巧的技术博客

  • 相关阅读:
    elk使用docker安装
    fastdfs使用docker安装
    jenkins构建执行shell脚本提示permission-denied
    mongodb数据库安装及管理工具mongo-express安装(docker方式)
    docker中文乱码问题解决
    TIDB3.0下线tikv节点
    冲刺第六天
    冲刺第五天
    评价用过的浏览器
    描述用户场景
  • 原文地址:https://www.cnblogs.com/arthas/p/4657875.html
Copyright © 2020-2023  润新知