GCD之dispatch_set_target_queue

序言:dispatch_queue_create函數(shù)生成的dispatch queue不管是serial 還是concurrent,都使用與默認(rèn)優(yōu)先級Global Dispatch Queue相同的執(zhí)行優(yōu)先級。而要變更生成的dispatch queue的執(zhí)行優(yōu)先級要使用dispatch_set_target_queue函數(shù)。

Snip20170510_1.png

注意:如果第一個參數(shù)不能指定為是系統(tǒng)提供的Main dispatch queue或者Global dispatch queue;

  • 該函數(shù)還有一個重要的作用就是可以改變dispatch queue的執(zhí)行階層。

在必須將不可并行執(zhí)行的處理追加到多個serial dispatch queue中時,如果使用dispatch_set_target_queue函數(shù)將目標(biāo)指定為某一個serial dispatch queue,即可防止處理并行執(zhí)行。

{
    //目標(biāo)隊列
    dispatch_queue_t targetQueue = dispatch_queue_create("target", DISPATCH_QUEUE_SERIAL);
        //可以并發(fā)執(zhí)行的串行隊列
    dispatch_queue_t q1 = dispatch_queue_create("x", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q2 = dispatch_queue_create("xx", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q3 = dispatch_queue_create("xxx", DISPATCH_QUEUE_SERIAL);
        //指定目標(biāo)隊列
    dispatch_set_target_queue(q1, targetQueue);
    dispatch_set_target_queue(q2, targetQueue);
    dispatch_set_target_queue(q3, targetQueue);
    
    
    dispatch_async(q1, ^{
      //code
    });
        dispatch_async(q2, ^{
       //code
    });
    dispatch_async(q3, ^{
       //code
    });
}

注意:
serial disPatch queue是一個串行隊列,只能同時執(zhí)行1個追加處理(即任務(wù)),當(dāng)用dispatch_queue_create函數(shù)生成多個serial disPatch queue時,每個serial disPatch queue均獲得一個線程,即多個serial disPatch queue可并發(fā)執(zhí)行,同時處理添加到各個serial disPatch queue中的任務(wù),但要注意如果過多地使用多線程,就會消耗大量內(nèi)存,引起大量的上下文切換,大幅度降低系統(tǒng)的響應(yīng)性能,所以我們只在為了避免多個線程更新相同資源導(dǎo)致數(shù)據(jù)競爭時,使用serial disPatch queue

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容