美文网首页
主线程同步派发一个block任务死锁问题

主线程同步派发一个block任务死锁问题

作者: 猎手Andy | 来源:发表于2018-06-16 11:43 被阅读0次
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
//    dispatch_sync(mainQueue, ^{
//        //代码无法执行
//        NSLog(@"在主线程中同步执行block任务形成死锁");
//    });
    //改成async避免死锁
    dispatch_async(mainQueue, ^{
            //代码无法执行
            NSLog(@"在主线程中异步执行block任务不形成死锁");
    });
}

死锁的原因:

 主队列是串行队列,执行同步派发(dispatch_sync)时将等待其派发的block任务执行完毕后再返回,即不是立即返回,阻塞在此。
 而block任务由于处在串行队列中,需要等前面派发的代码执行完毕才能执行,形成死锁。

解决办法:

不要同步派发,采用异步派发dispatch_async(派发完立即返回),则不形成死锁.

参考官方文档dispatch_sync

Submits a block to a dispatch queue for synchronous execution. Unlike dispatch_async, this function does not return until the block has finished.
这个函数直到派发的block执行完毕才返回,因此在当前队列调用会导致死锁。
Calling this function and targeting the current queue results in deadlock.

Unlike with dispatch_async, no retain is performed on the target queue. Because calls to this function are synchronous, it "borrows" the reference of the caller. Moreover, no Block_copy is performed on the block.

block不会自动复制到堆上,与dispatch_async不一样。

As an optimization, this function invokes the block on the current thread when possible.

Tip:百度如何搜索苹果开发者文档API参考?

以搜索苹果官方网站的dispatch_sync的参考为例,输入以下内容:

dispatch_sync site:apple.com

相关文章

  • 主线程同步派发一个block任务死锁问题

    死锁的原因: 解决办法: 不要同步派发,采用异步派发dispatch_async(派发完立即返回),则不形成死锁....

  • GCD分析(中)

    同步函数死锁 死锁现象 主线程因为同步函数的原因等着先执⾏任务 主队列等着主线程的任务执⾏完毕再执⾏⾃⼰的任务 主...

  • GCD 串行队列并行队列和同步派发异步派发

    串行队列 异步派发 不会造成线程阻塞,但是会依次执行派发任务 同步派发 依次执行派发任务,会阻塞线程 先异步派发再...

  • iOS笔记-多线程

    同步函数&串行队列 不会开启线程,在当前线程执行任务 任务串行执行,任务一个接着一个 会产生堵塞(死锁,崩溃) 主...

  • GCD&NSOperationQueue

    GCD队列规律 同步派发任务只能在当前线程执行 异步派发任务可以在其他线程执行 串行队列任务只能在一个线程中执行 ...

  • iOS 解决同步任务提交当前队列死锁问题

    场景 同步提交到主队列 死锁,崩溃。 原因: 主队列在执行viewDidLoad任务,又同步执行block任务;v...

  • iOS 多线程面试题(死锁)

    死锁 死锁就是队列引起的循环等待 1、一个比较常见的死锁例子:主队列同步 在主线程中运用主队列同步,也就是把任务放...

  • Synchronized关键字详解2(对非object持锁)

    4.死锁:同步方法容易造成死锁。Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁...

  • 死锁

    死锁场景: 任务互相等待 不正确的加锁 任务等待 先看区别: 同步/异步同步指不开启新线程,在当前线程等待执行任务...

  • iOS多线程(一)

    多线程涉及到的概念: 进程,线程,主线程,任务,队列,死锁,串行,并行,同步,异步,GCD,NSOperation...

网友评论

      本文标题:主线程同步派发一个block任务死锁问题

      本文链接:https://www.haomeiwen.com/subject/fffbeftx.html