1.首先看下面一段代碼函數
dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL);spa
dispatch_sync(queue, ^{//taskA線程
//do something
dispatch_sync(queue, ^{//taskB
//啥也幹不了
});
複製代碼
});code
dispatch_sync函數用於將一個block(任務)提交到隊列中同步執行,直到block執行完後,這個函數纔會返回。queue是一個串行隊列,若是前後加入兩個任務,taskA和taskB, 那麼只有taskA執行完以後taskB才能執行。若是taskB是在taskA中加進隊列的,那麼它們依然遵照先進先出原則,即taskA執行完以後taskB才執行,也就是taskB在等待taskA完成。可是由於dispatch_sync的同步特性,taskB執行不完taskA就不算完成,即taskA在等待taskB的完成,這樣就發生了死鎖。隊列
根據上面那份代碼,咱們就能夠理解下面的代碼爲何會阻塞主線程了。get
dispatch_queue_t mainQueue = dispatch_get_main_queue();同步
dispatch_sync(mainQueue, ^{class
NSLog(@"hello");
複製代碼
});queue
mainQueue是系統建立的,在執行上面的代碼以前就已經加進去了不少任務 dispatch_queue_t queue = dispatch_queue_create("Main", DISPATCH_QUEUE_SERIAL);di
dispatch_sync(queue, ^{
//Task A
複製代碼
}); ... dispatch_sync(queue, ^{
//Task N
複製代碼
});
在這N個任務裏有一個任務是這樣的: dispatch_sync(queue, ^{
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
NSLog(@"hello");
});
複製代碼
});
因此,發生死鎖就是必然的了。