鍍金池/ 問(wèn)答/Java  iOS  網(wǎng)絡(luò)安全/ iOS GCD隊(duì)列阻塞問(wèn)題

iOS GCD隊(duì)列阻塞問(wèn)題

代碼1

dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
    NSLog(@"為啥堵塞");
});

代碼2

dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
    NSLog(@"為啥不堵塞");
});

如上,兩段代碼,都運(yùn)行在主線程中,mainQueue也是串行隊(duì)列,為什么代碼1會(huì)造成線程阻塞,而代碼2不會(huì)阻塞?或者說(shuō)代碼2不會(huì)阻塞大家可能都了解,為什么在主隊(duì)列調(diào)用dispatch_sync就會(huì)阻塞?

回答
編輯回答
涼心人
2018年3月16日 11:03
編輯回答
苦妄

串行并行是對(duì)隊(duì)列而言的,串行隊(duì)列要對(duì)加入其中的任務(wù)執(zhí)行過(guò)程前面的執(zhí)行完后面的任務(wù)才能執(zhí)行。
代碼1只有一個(gè)主隊(duì)列,而代碼2有兩個(gè)隊(duì)列。代碼1的主隊(duì)列也就要求了任務(wù)必須是執(zhí)行完

任務(wù)A
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
});

這一句才能執(zhí)行其他的,但是你這個(gè)又是同步,所以必須要先執(zhí)行

 任務(wù)B
 NSLog(@"為啥堵塞");

才能執(zhí)行其他的,這樣的邏輯很明顯會(huì)使當(dāng)前的主隊(duì)列阻塞。

再看第二個(gè),

任務(wù)A
dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
});

任務(wù)A是主隊(duì)列

NSLog(@"為啥不堵塞");

這句是在abc串行隊(duì)列,這都是兩個(gè)隊(duì)列,所以不要求任務(wù)A執(zhí)行完再執(zhí)行任務(wù)B,由于是同步,所以是先執(zhí)行任務(wù)A的一部分,再去執(zhí)行任務(wù)B的一部分,最后再去執(zhí)行任務(wù)A,只不過(guò)這個(gè)過(guò)程都是主線程執(zhí)行而已。

2018年1月24日 18:31
編輯回答
舊酒館

為什么1會(huì)阻塞?因?yàn)?是主線程,runloop會(huì)時(shí)時(shí)監(jiān)聽(tīng)和更新UI,你這里給它安排一個(gè)同步sync肯定阻塞,應(yīng)該用異步async。
為什么2不會(huì)阻塞?不是不會(huì)阻塞,只是不會(huì)阻塞主線程,因?yàn)槟氵@里新建的一個(gè)子線程,如果你在這個(gè)子線程里寫(xiě)個(gè)while(TRUE),然后再用這個(gè)子線程來(lái)同步(sync)一個(gè)操作,你看看會(huì)不會(huì)阻塞這個(gè)子線程。

2017年9月2日 10:38
編輯回答
孤慣

循環(huán)等待。你在主線程同步派發(fā)一個(gè)任務(wù),那主線程就要等這個(gè)任務(wù)執(zhí)行完才繼續(xù)執(zhí)行。而你又把任務(wù)派發(fā)在主線程,主線程現(xiàn)在在等待這個(gè)完成繼續(xù)執(zhí)行,這個(gè)任務(wù)又在等待主線程空閑來(lái)執(zhí)行。

2018年6月26日 11:42
編輯回答
何蘇葉

第一個(gè)是阻塞mainQueue, 然后讓mainQueue去把block里面的東西加到mainQueue中去
第二個(gè)是阻塞dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL), 然后讓mainQueue把block里面的東西加到dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL)中去.

2017年1月8日 08:10
編輯回答
歆久
  • 1

    App:主線程,你過(guò)來(lái),給你個(gè)任務(wù),任務(wù)完成后再走
    主線程:什么任務(wù)?
    App:你去那邊打印機(jī)上,打印個(gè)東西,但是你不能離開(kāi)這里,完成后才能走
    主線程:……
    
  • 2

    App:主線程,你過(guò)來(lái),給你個(gè)任務(wù),任務(wù)完成后再走
    主線程:什么任務(wù)?
    App:你叫 **abc** 去那邊打印機(jī)上,打印個(gè)東西,但是你不能離開(kāi)這里,完成后才能走
    主線程:**abc**,快去打印個(gè)東西,現(xiàn)在就要!
2018年5月26日 10:07