案列1 会产生死锁.
- (void)interview01
{
// 问题:以下代码是在主线程执行的,会不会产生死锁?会!
NSLog(@"执行任务1");
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"执行任务2");
});
NSLog(@"执行任务3");
// dispatch_sync立马在当前线程同步执行任务
}
案列1 不会产生死锁.
- (void)interview031
{
NSLog(@"执行任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueue",DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
NSLog(@"执行任务2");
NSLog(@"%@",[NSThread currentThread]);
});
NSLog(@"执行任务3");
}
案例1 产生死锁,案例2 没有,其实本质原因就在于死锁产生的本质是
在某一个串行队列中,同步的向这个队列添加任务
案例1 中 在主队列(主队列也是一个串行队列)中同步添加block任务,导致主线程等待dispatch_sync函数执行完后处理block,而block等待主线程执行dispatch_sync函数结束,函数结束又需要block执行结束,导致相互等待,产生死锁.
案例2 中,另外开了一个串行队列,与主队列不是相同的串行队列,不会产生相互等待对方,因此不会死锁.
案列3 会死锁
- (void)interview03
{
// 问题:以下代码是在主线程执行的,会不会产生死锁?会!
NSLog(@"执行任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{ // 0
NSLog(@"执行任务2");
dispatch_sync(queue, ^{ // 1
NSLog(@"执行任务3");
});
NSLog(@"执行任务4");
});
NSLog(@"执行任务5");
}
前面讲过,在某一个串行队列中,同步的向这个队列添加任务会产生死锁,案列3 就是在myqueu这个串行队列中同步添加任务3,导致死锁.
解决方案
异步 dispatch_async,或者 使用不相同的串行队列.