//在主線程執(zhí)行
- (void)testGCD
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
});
NSLog(@"4");
while (1) {
}
NSLog(@"5");
}
問主線程執(zhí)行testGCD
后控制臺打印的結(jié)果是什么酝惧?
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
});
以上部分會異步將block
任務(wù)提交到一個全局并行隊列中,該任務(wù)我們記為async_task
董瞻;同時主線程下面的代碼可以稱為main_task
:
NSLog(@"4");
while (1) {
}
NSLog(@"5");
可以知道async_task
和main_task
是并發(fā)執(zhí)行的暴心,因此執(zhí)行結(jié)果可能有兩種情況:先打印4后打印1或者相反(235下面討論);
這時關(guān)注async_task
里的dispatch_sync
任務(wù)谷遂,我們記作sync_task
。
這個任務(wù)會同步提交到主隊列等待執(zhí)行卖鲤,返回后才會打印3肾扰。
而在sync_task
前面串行等待的任務(wù)還有main_task
畴嘶,也就是sync_task
要等待main_task
執(zhí)行完才執(zhí)行。
而這里的main_task
包含一個while(1){}
的死循環(huán)代碼集晚,因此永遠(yuǎn)執(zhí)行不完掠廓,那么sync_task
就會一直等待,這就造成一個持續(xù)等待的局面甩恼。
簡單點說就是蟀瞧,2被5卡住了,3被2卡住了条摸。
因此不僅2無法打印悦污,3和5也打印不出來。
所以最終結(jié)果是4, 1
或者1, 4
钉蒲。