iOS 同步、異步、串行、并行探索

  • 對(duì)同步、異步、串行、并行的執(zhí)行順序,之前總是模棱兩可,今天寫個(gè)Demo測(cè)試一下,廢話不多說(其實(shí)也不會(huì)說),直接上測(cè)試代碼
一、首先定義兩個(gè)方法,一個(gè)同步執(zhí)行相應(yīng)代碼,一個(gè)異步執(zhí)行
//同步執(zhí)行
- (void)syncTestWithQueue:(dispatch_queue_t)queue withBarrier:(BOOL)barrer{
    NSLog(@"1");
    dispatch_sync(queue, ^{
        NSLog(@"start 1");
        sleep(3);
        NSLog(@"end 1");
    });
    NSLog(@"2");
    dispatch_sync(queue, ^{
        NSLog(@"start 2");
        sleep(3);
        NSLog(@"end 2");
    });
    NSLog(@"3");
    dispatch_sync(queue, ^{
        NSLog(@"start 3");
        sleep(3);
        NSLog(@"end 3");
    });
    NSLog(@"4");
    dispatch_sync(queue, ^{
        NSLog(@"start 4");
        sleep(3);
        NSLog(@"end 4");
    });
    NSLog(@"5");
    
    if (barrer) {
        dispatch_barrier_sync(queue, ^{
            NSLog(@"barrier start 1");
            sleep(3);
            NSLog(@"barrier end 1");
        });
        NSLog(@"6");
        dispatch_sync(queue, ^{
            NSLog(@"start 5");
            sleep(3);
            NSLog(@"end 5");
        });
        NSLog(@"7");
    }
}

//異步執(zhí)行
- (void)asyncTestWithQueue:(dispatch_queue_t)queue withBarrier:(BOOL)barrer{
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"start 1");
        sleep(3);
        NSLog(@"end 1");
    });
    NSLog(@"2");
    dispatch_async(queue, ^{
        NSLog(@"start 2");
        sleep(3);
        NSLog(@"end 2");
    });
    NSLog(@"3");
    dispatch_async(queue, ^{
        NSLog(@"start 3");
        sleep(3);
        NSLog(@"end 3");
    });
    NSLog(@"4");
    
    if (barrer) {
        dispatch_barrier_async(queue, ^{
            NSLog(@"barrier start 1");
            sleep(3);
            NSLog(@"barrier end 1");
        });
        NSLog(@"5");
        dispatch_async(queue, ^{
            NSLog(@"start 4");
            sleep(3);
            NSLog(@"end 4");
        });
        NSLog(@"6");
    }
}

二、在自行創(chuàng)建串行隊(duì)列執(zhí)行這兩個(gè)方法

測(cè)試代碼

    //自行創(chuàng)建串行隊(duì)列
    dispatch_queue_t serialQueue=dispatch_queue_create("串行隊(duì)列", DISPATCH_QUEUE_SERIAL);
    //1.同步
    [self syncTestWithQueue:serialQueue withBarrier:YES];
    //2.異步
    [self asyncTestWithQueue:serialQueue withBarrier:YES];

輸出結(jié)果

syncTestWithQueue: withBarrier:
asyncTestWithQueue: withBarrier:

結(jié)論:

1.同步與異步block的執(zhí)行順序都是按順序執(zhí)行的,不同的是同步會(huì)阻塞線程,異步不會(huì)
2.dispatch_barrier,執(zhí)行順序 和 dispatch_sync與dispatch_async加入的block是一樣的

三、主線程串行隊(duì)列

測(cè)試代碼

    dispatch_queue_t mainSerialQueue=dispatch_get_main_queue();
    //1.同步
    //會(huì)阻塞,不用想了
    [self syncTestWithQueue:mainSerialQueue withBarrier:YES];
    //2.異步
    [self asyncTestWithQueue:mainSerialQueue withBarrier:YES];

輸出結(jié)果

asyncTestWithQueue: withBarrier:

結(jié)論

同步會(huì)阻塞,異步和自行創(chuàng)建串行隊(duì)列是一樣的

四、自行創(chuàng)建并行隊(duì)列

測(cè)試code

    dispatch_queue_t concurrentQueue=dispatch_queue_create("并行隊(duì)列", DISPATCH_QUEUE_CONCURRENT);
    //1.同步
    [self syncTestWithQueue:concurrentQueue withBarrier:YES];
    //2.異步
    [self asyncTestWithQueue:concurrentQueue withBarrier:YES];

輸出

syncTestWithQueue: withBarrier:
asyncTestWithQueue: withBarrier:

結(jié)論

1.同步:由于會(huì)阻塞線程,所以并行與串行執(zhí)行順序是一樣的
2.異步:所有block都會(huì)一起執(zhí)行,dispatch_barrier執(zhí)行時(shí)之后加入的block,會(huì)等待barrier執(zhí)行完再執(zhí)行

五、全局并行隊(duì)列

測(cè)試code

    dispatch_queue_t globalConcurrentQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //1.同步
    [self syncTestWithQueue:globalConcurrentQueue withBarrier:YES];
    //2.異步
    [self asyncTestWithQueue:globalConcurrentQueue withBarrier:YES];

輸出

syncTestWithQueue: withBarrier:
asyncTestWithQueue: withBarrier:

結(jié)論

1.同步:與自行創(chuàng)建并發(fā)隊(duì)列是一樣的
2.異步:所有block都會(huì)一起執(zhí)行,但是,dispatch_barrier執(zhí)行時(shí)之后加入的block,不會(huì)等待barrier執(zhí)行完再執(zhí)行(dispatch_barrier不要用在全局并發(fā)隊(duì)列里)

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. GCD簡(jiǎn)介 iOS開發(fā)中多線程的API主要有pthread,NSThread,NSOperation和GCD...
    安東_Ace閱讀 1,388評(píng)論 0 6
  • 串行隊(duì)列、并行隊(duì)列、同步、異步是gcd編程中四個(gè)非常重要的概念,它們的組合會(huì)產(chǎn)生多種不同的執(zhí)行順序,在本文,我主要...
    wind_dy閱讀 1,324評(píng)論 0 2
  • 背景 擔(dān)心了兩周的我終于輪到去醫(yī)院做胃鏡檢查了!去的時(shí)候我都想好了最壞的可能(胃癌),之前在網(wǎng)上查的癥狀都很相似。...
    Dely閱讀 9,388評(píng)論 21 42
  • 從哪說起呢? 單純講多線程編程真的不知道從哪下嘴。。 不如我直接引用一個(gè)最簡(jiǎn)單的問題,以這個(gè)作為切入點(diǎn)好了 在ma...
    Mr_Baymax閱讀 2,909評(píng)論 1 17
  • 序詩 懷杜子美 魂歸來兮,白首搔頭的詩翁 魂歸去兮,麻鞋布衣的儒生 入門便是滿耳的嚎啕,眼淚干涸成道道兵車的轍痕 ...
    臨冬雪狼閱讀 983評(píng)論 0 0

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