1.死锁产生的原因
- 死锁是指多个进程或线程在运行过程中因争夺资源而造成的一种僵局。若无外力作用,它们都将无法向前推进。通俗来讲,死锁是多个进程或线程互相等待其它的进程或线程完成后才能继续执行,这样相互等待谁都无法完成。
案例
-
在主线程中调用同步执行 + 主队列
- (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"12"); //任务1 }); NSLog(@"3"); //任务2
}
打印日志如下
原因分析
- dispatch_sync是同步线程
- dispatch_get_main_queue()是运行在主线程中的主队列
- 任务1是同步的任务
- 任务2要等任务1完成之后才会运行
在上面的基础上,首先主线程运行到dispatch_sync是不会立即返回,而是会堵锁线程,等block块的内容执行完毕后才会执行,而dispatch_sync中的块是将任务一加到了任务二的后面,而任务一需要dispatch_sync执行完毕后才可以进行,但是块内的任务被添加到了主队列中,要遵循FIFO,任务一的执行条件是任务二需要被执行。
这时就有一个问题:任务2在等待dispatch_sync返回(即执行完block里的任务1)后才会执行,但是在任务队列里任务2可是在任务1的前面,这时就进入了互相等待的场面,即形成了死锁。
总结一下发生死锁的原因是因为 在当前队列中同步加入任务从而造成死锁。
2)
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"XiYouMobile:%@",[NSThread currentThread]);
});
}
namo