iOS GCD_1

這篇主要寫的是1、同異步派發(fā)(dispatch_async、dispatch_sync)
2、串并行隊(duì)列(DISPATCH_QUEUE_SERIAL、DISPATCH_QUEUE_CONCURRENT)

1.同異步派發(fā)(dispatch_async、dispatch_sync)

  • dispatch_sync:同步派發(fā)。當(dāng)走到dispatch_sync 時(shí),不直接返回,而要直接走完block的代碼.
示例:
    char *sync = "sycnQ";
    dispatch_queue_t syncQ = dispatch_queue_create(sync, DISPATCH_QUEUE_SERIAL);
    dispatch_sync(syncQ, ^{
        NSLog(@"同步串行隊(duì)列  當(dāng)前線程------>%@", [NSThread currentThread]);
    });
    dispatch_sync(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"同步并行隊(duì)列  當(dāng)前線程------>%@", [NSThread currentThread]);
    });
    //這個(gè)會(huì)造成線程阻塞,因?yàn)閐ispatch_sync要走完block的代碼  而主線程要等待block走完 才會(huì)走  所以同步主隊(duì)列會(huì)造成阻塞crash
    dispatch_sync(dispatch_get_main_queue(), ^
    });
打印結(jié)果:
2017-06-15 20:26:05.013 Block[9706:237965] 同步串行隊(duì)列  當(dāng)前線程------><NSThread: 0x618000075640>{number = 1, name = main}
2017-06-15 20:26:05.013 Block[9706:237965] 同步并行隊(duì)列  當(dāng)前線程------><NSThread: 0x618000075640>{number = 1, name = main}
(lldb) 

就是因?yàn)槭峭脚砂l(fā)相當(dāng)于同步執(zhí)行task,不會(huì)先執(zhí)行后面的task。

而同步派發(fā)所在的線程為他所在環(huán)境的線程

示例:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        NSLog(@"aaa當(dāng)前線程------>%@", [NSThread currentThread]);
        char *sync1 = "sycnQ1";
        dispatch_queue_t syncQ1 = dispatch_queue_create(sync1, DISPATCH_QUEUE_CONCURRENT);
        dispatch_sync(syncQ1, ^{
            
            NSLog(@"bbb當(dāng)前線程------>%@", [NSThread currentThread]);
        });
    });
打印結(jié)果:
2017-06-15 20:39:58.953 Block[9833:245664] aaa當(dāng)前線程------><NSThread: 0x6180000770c0>{number = 3, name = (null)}
2017-06-15 20:39:58.953 Block[9833:245664] bbb當(dāng)前線程------><NSThread: 0x6180000770c0>{number = 3, name = (null)}
  • 異步派發(fā)。當(dāng)走到dispatch_async 時(shí),直接返回,繼續(xù)執(zhí)行他所在線程的其他代碼任務(wù)。
示例:
 NSLog(@"startstartstartstartstartstartstart");
    char *async = "asycnQ";
    dispatch_queue_t asyncQ = dispatch_queue_create(async, DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(asyncQ, ^{
        NSLog(@"異步并行隊(duì)列  當(dāng)前線程------>%@", [NSThread currentThread]);
    });
    dispatch_async(dispatch_get_main_queue(), ^{
       
        NSLog(@"異步主隊(duì)列  當(dāng)前線程------>%@", [NSThread currentThread]);
    });
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        NSLog(@"異步全局隊(duì)列  當(dāng)前線程------>%@", [NSThread currentThread]);
    });
    char *sync = "sycnQ";
    dispatch_queue_t syncQ = dispatch_queue_create(sync, DISPATCH_QUEUE_SERIAL);
    dispatch_async(syncQ, ^{
        
        NSLog(@"異步串行隊(duì)列  當(dāng)前線程------>%@", [NSThread currentThread]);
    });
    
    NSLog(@"endendendendendendendendend");
結(jié)果為:
2017-06-15 21:05:55.498 Block[9937:254941] startstartstartstartstartstartstart
2017-06-15 21:05:55.498 Block[9937:254941] endendendendendendendendend
2017-06-15 21:05:55.498 Block[9937:255124] 異步串行隊(duì)列  當(dāng)前線程------><NSThread: 0x61000007d5c0>{number = 3, name = (null)}
2017-06-15 21:05:55.498 Block[9937:255123] 異步并行隊(duì)列  當(dāng)前線程------><NSThread: 0x6000002622c0>{number = 4, name = (null)}
2017-06-15 21:05:55.498 Block[9937:255127] 異步全局隊(duì)列  當(dāng)前線程------><NSThread: 0x61800007e7c0>{number = 5, name = (null)}
2017-06-15 21:05:55.503 Block[9937:254941] 異步主隊(duì)列  當(dāng)前線程------><NSThread: 0x60000007c740>{number = 1, name = main}

所以異步派發(fā)只在主隊(duì)列不創(chuàng)建線程,在并行(包括全局隊(duì)列)、和串行(不包括主隊(duì)列)都會(huì)創(chuàng)建線程

2.串并行隊(duì)列(DISPATCH_QUEUE_SERIAL、DISPATCH_QUEUE_CONCURRENT)

  • 串行隊(duì)列:按把任務(wù)丟進(jìn)隊(duì)列的順序,同步執(zhí)行(無論是同步派發(fā)還是異步派發(fā):只是影響在哪個(gè)線程執(zhí)行這個(gè)任務(wù))。
  • 并行隊(duì)列:針對(duì)同一個(gè)并行隊(duì)列,加入n個(gè)任務(wù),如果都是異步派發(fā)則會(huì)創(chuàng)建n個(gè)線程,同時(shí)執(zhí)行n個(gè)任務(wù)。 如果都是同步派發(fā),則會(huì)根據(jù)加入task順序執(zhí)行
示例:
char *asyncStr = "asycnQ";
    dispatch_queue_t asyncQ = dispatch_queue_create(asyncStr, DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(asyncQ, ^{
        
        NSLog(@"異步并行隊(duì)列  線程------>%@  數(shù)字------>%d", [NSThread currentThread], 1);
    });
    
    dispatch_async(asyncQ, ^{
        
        NSLog(@"異步并行隊(duì)列  線程------>%@  數(shù)字------>%d", [NSThread currentThread], 2);
    });
    
    dispatch_sync(asyncQ, ^{
        
        NSLog(@"同步并行隊(duì)列  線程------>%@  數(shù)字------>%d", [NSThread currentThread], 3);
    });
    
    dispatch_async(asyncQ, ^{
        
        NSLog(@"異步并行隊(duì)列  線程------>%@  數(shù)字------>%d", [NSThread currentThread], 4);
    });
    
    dispatch_async(asyncQ, ^{
        
        NSLog(@"異步并行隊(duì)列  線程------>%@  數(shù)字------>%d", [NSThread currentThread], 5);
    });
結(jié)果1:
2017-06-15 22:35:34.854 Block[11257:294626] 異步并行隊(duì)列  線程------><NSThread: 0x61000006adc0>{number = 1, name = main}  數(shù)字------>3
2017-06-15 22:35:34.854 Block[11257:294667] 異步并行隊(duì)列  線程------><NSThread: 0x610000073500>{number = 3, name = (null)}  數(shù)字------>1
2017-06-15 22:35:34.854 Block[11257:294664] 異步并行隊(duì)列  線程------><NSThread: 0x6100000735c0>{number = 4, name = (null)}  數(shù)字------>2
2017-06-15 22:35:34.855 Block[11257:294665] 異步并行隊(duì)列  線程------><NSThread: 0x600000069540>{number = 5, name = (null)}  數(shù)字------>4
2017-06-15 22:35:34.855 Block[11257:294667] 異步并行隊(duì)列  線程------><NSThread: 0x610000073500>{number = 3, name = (null)}  數(shù)字------>5
結(jié)果二:
2017-06-15 22:47:14.167 Block[12836:303509] 同步并行隊(duì)列  線程------><NSThread: 0x608000079c00>{number = 1, name = main}  數(shù)字------>3
2017-06-15 22:47:14.168 Block[12836:303665] 異步并行隊(duì)列  線程------><NSThread: 0x60000007a700>{number = 4, name = (null)}  數(shù)字------>2
2017-06-15 22:47:14.167 Block[12836:303667] 異步并行隊(duì)列  線程------><NSThread: 0x61000007fb40>{number = 3, name = (null)}  數(shù)字------>1
2017-06-15 22:47:14.168 Block[12836:303694] 異步并行隊(duì)列  線程------><NSThread: 0x60000007a400>{number = 5, name = (null)}  數(shù)字------>4
2017-06-15 22:47:14.168 Block[12836:303695] 異步并行隊(duì)列  線程------><NSThread: 0x61800007ea40>{number = 6, name = (null)}  數(shù)字------>5
結(jié)果3:
2017-06-15 22:56:12.379 Block[13913:309705] 異步并行隊(duì)列  線程------><NSThread: 0x61000007e400>{number = 4, name = (null)}  數(shù)字------>2
2017-06-15 22:56:12.379 Block[13913:309596] 同步并行隊(duì)列  線程------><NSThread: 0x60800007ce40>{number = 1, name = main}  數(shù)字------>3
2017-06-15 22:56:12.379 Block[13913:309735] 異步并行隊(duì)列  線程------><NSThread: 0x61800007fa40>{number = 3, name = (null)}  數(shù)字------>1
2017-06-15 22:56:12.380 Block[13913:309705] 異步并行隊(duì)列  線程------><NSThread: 0x61000007e400>{number = 4, name = (null)}  數(shù)字------>4
2017-06-15 22:56:12.380 Block[13913:309703] 異步并行隊(duì)列  線程------><NSThread: 0x61000007e9c0>{number = 5, name = (null)}  數(shù)字------>5
結(jié)果...

每次打印都不一樣,我的理解是當(dāng)執(zhí)行到3時(shí),因?yàn)?是同步派發(fā),所以會(huì)在主線程執(zhí)行任務(wù),在執(zhí)行任務(wù)期間,3之前的1 2 都加入到了asyncQ并行隊(duì)列,也同時(shí)執(zhí)行,可能執(zhí)行完了,也可能只執(zhí)行了一個(gè),也可能都沒執(zhí)行完 所以前三個(gè)排序 是123 132 213 231 312 321 雖然4 5和1 2都是異步并行隊(duì)列執(zhí)行,但是在同步執(zhí)行時(shí) 4 5 還沒加入隊(duì)列 所以 12 要比45快
GCD_1Demo傳送門

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

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

  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項(xiàng)。當(dāng)然也會(huì)給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 700評(píng)論 0 0
  • iOS 多線程系列 -- 基礎(chǔ)概述iOS 多線程系列 -- pthreadiOS 多線程系列 -- NSThrea...
    shannoon閱讀 999評(píng)論 0 2
  • 1. GCD簡介 什么是GCD呢?我們先來看看百度百科的解釋簡單了解下概念 引自百度百科:Grand Centra...
    千尋_544f閱讀 522評(píng)論 0 0
  • 緣 聚散 離又合 不曾琢磨 嘆世間冷暖 殊不知英雄落 感人世再起風(fēng)波 古今難辨情為何物 道不盡紅塵眷戀為何 雖常想...
    成利多吉閱讀 821評(píng)論 0 0

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