Swift学习笔记

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");
上面这段代码同样会造成死锁,任务4卡在了任务3这里,基本上第一个的情况是差不多的
上一篇下一篇

猜你喜欢

热点阅读