YYDispatchQueuePool源码笔记

工具做者在实际开发中,因为开了不少线程去作异步绘制、下载等工做,并且有的线程可能由于资源锁等待的缘由,可能致使开更多的线程。当线程过多时,线程占用了过多资源,可能致使主线程受影响,出现卡顿问题ios

而iOS框架中有最大并发数概念的目测只有NSOpeartionQueue了,但GCD的代码却没法使用该特性git

因而写了该工具,能够方便地建立一个队列池,相似于线程池的概念,能够避免开辟线程过多的问题github

Feature

  • 内部使用串行队列来管理线程
  • 最多串行队列数不超过32个,因此线程数也不会超过该值
  • 提供两种获取队列池的方式
    • 全局方法,获取一个队列池
    • 本身建立一个队列池管理类,管理串行队列

原理

核心工做就两步骤bash

  1. 根据qos、当前CPU状况以及所需的输入建立多个串行队列
    • 队列信息存储在YYDispatchContext结构体中
  2. 结构体中有一个counter,每次调用YYDispatchQueueGetForQOScounter加一,同时使用counter % queueCount做为下标来轮询地到context中获取一个queue

YYDispatchContext结构体以下多线程

typedef struct {
    const char *name;
    void **queues;
    uint32_t queueCount;
    int32_t counter;
} YYDispatchContext;
复制代码

参考

相关文章
相关标签/搜索