iOS - 死锁
2022-03-14 本文已影响0人
aven_kang
原因:使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)
NSLog(@"执行任务1");
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"执行任务2");
});
NSLog(@"执行任务3");
我们来梳理一下这个流程
主线程: 任务1->sync->任务3
主队列:viewDidLoad->任务2
在主线程里,任务3在等待任务2(sync)的执行完毕,而在主队列,任务2在等待viewDidLoad执行完毕,而任务3恰巧就在viewDidLoad里面,造成了任务3在等任务2,任务2在等任务3,如下图所示
image.png
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");