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");
});
复制代码
});
因此,发生死锁就是必然的了。