美文网首页iOS面试系列
dispatch_sync 和 dispatch_get_mai

dispatch_sync 和 dispatch_get_mai

作者: I_YoYo | 来源:发表于2017-08-27 20:52 被阅读83次

上一篇文章 介绍syn/asyn和queue的各种搭配时,提到有产生死锁崩溃的情况,现简单介绍下。

例1
- (void)viewDidLoad
{
   NSLog(@"---1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"---2");
    });
    NSLog(@"---3");
});

打印了1,并不会打印2和3,会死锁崩溃,因为dispatch_sync是同步,会阻塞当前主线程,等代码块里面内容执行完后再往下继续执行,然而根据dispatch_get_main_queue判断,代码块内的代码又需在主线程中执行,主线程已被阻塞了,所以代码块处于永远等待中。

例2
- (void)viewDidLoad {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"----1");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"----2");
        });
        NSLog(@"---3");
    });
    NSLog(@"---4");
     while (YES) {}
}

2和3永远不会被打印,因为1在异步子线程中执行,所以可能1比4先打印。
这种情况下,因为2需要在主线程中同步执行,当打印了1后,把异步代码放到后台等待获取主线程,先执行4。然而遇到个死循环阻塞了主线程,而2又需要主线程才能执行,所以2处于永远等待获取主线程。

例3
NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_sync(queue, ^{
                    NSLog(@"3");
                });
        NSLog(@"4");
    });
     NSLog(@"5");

3和4永远不会被打印被锁死,3(dispatch_sync)同步等待dispatch_async这个代码块执行完再执行。而3又被dispatch_sync阻塞,且加入到队列任务尾部,等待队列queue里的任务执行执行完后再执行。

#####总结:

根据dispatch_async和dispatch_sync判断是否会阻塞线程。
根据queue判断是否开线程/还是当前线程执行。


有什么错误欢迎批评指正 。

相关文章

  • dispatch_sync 和 dispatch_get_mai

    在上一篇文章 介绍syn/asyn和queue的各种搭配时,提到有产生死锁崩溃的情况,现简单介绍下。 例1 打印了...

  • GCD学习(六) dispatch_async 和dispatc

    GCD学习(六) dispatch_async 和dispatch_sync dispatch_sync(),同步...

  • 2018 多线程

    1. dispatch_async/dispatch_sync dispatch_sync: 同步/阻塞当前的...

  • gcd 死锁

    同步、异步:使用dispatch_sync(同步) :dispatch_sync 方法会被加入当前队列,而且dis...

  • GCD底层

    一、同步执行dispatch_sync 1.1 锁的原因 我们都知道,当使用dispatch_sync在串行队列上...

  • GCD的使用

    1.dispatch_async和dispatch_sync的区别 (来自http://www.cnblogs.c...

  • GCD学习(七) dispatch_apply

    GCD学习(七) dispatch_apply dispathc_apply 是dispatch_sync 和di...

  • GCD学习 dispatch_apply

    dispathc_apply 是dispatch_sync 和dispatch_group的关联API. 它以指定...

  • GCD学习 dispatch_apply

    dispathc_apply 是dispatch_sync 和dispatch_group的关联API. 它以指定...

  • dispatch_apply

    作用: dispatch_apply函数是dispatch_sync函数和Dispatch Group的关联API...

网友评论

    本文标题:dispatch_sync 和 dispatch_get_mai

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