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;
複製代碼

參考

相關文章
相關標籤/搜索