iOS线程死锁

作者: iOS猿_员 | 来源:发表于2019-06-07 15:05 被阅读0次

    结论:使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)

    首先你要理解同步和异步执行的概念,同步和异步目的不是为了是否创建一个新的线程,同步会阻塞当前函数的返回,异步函数会立即返回执行下面的代码;队列是一种数据结构,队列有FIFO,LIFO等,控制任务的执行顺序,至于是否开辟一个新的线程,因为同步函数会等待函数的返回,所以在当前线程执行就行了,没必要浪费资源再开辟新的线程,如果是异步函数,当前线程需要立即函数返回,然后往下执行,所以函数里面的任务必须要开辟一个新的线程去执行这个任务。

    队列上是放任务的,而线程是去执行队列上的任务的

    【问题1】:以下代码是在主线程执行的,会不会产生死锁?会!

    NSLog(@"执行任务1");
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
    NSLog(@"执行任务2");
    });
    
    NSLog(@"执行任务3");
    

    dispatch_sync立马在当前线程同步执行任务

    分析:

    • 1、主线程中任务执行:任务1、sync、任务3、
    • 2、主队列:viewDidLoad、任务2、

    其中在主队列viewDidLoad里面的任务3执行结束才会执行任务2;而主线程中是执行完sync才会执行任务3。也就是任务2等待任务3执行,任务3再也等待任务2执行,造成死锁

    【问题2】:以下代码是在主线程执行的,会不会产生死锁?不会!

    - (void)interview02
    {
    
    NSLog(@"执行任务1");
    
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
    NSLog(@"执行任务2");
    });
    
    NSLog(@"执行任务3");
    
    // dispatch_async不要求立马在当前线程同步执行任务
    }
    

    因为dispatch_async不要求立马在当前线程同步执行任务,不会造成线程死锁

    【问题3】:以下代码是在主线程执行的,会不会产生死锁?会!

    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");
    

    其中执行任务3执行任务4之间造成死锁

    【问题4】:以下代码是在主线程执行的,会不会产生死锁?不会!

    - (void)interview04
    {
    
    NSLog(@"执行任务1");
    
    dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{ // 0
    NSLog(@"执行任务2");
    
    dispatch_sync(queue, ^{ // 1
    NSLog(@"执行任务3");
    });
    
    NSLog(@"执行任务4");
    });
    
    NSLog(@"执行任务5");
    }
    

    推荐个不错的iOS进阶视频,感兴趣可看一看:观看地址

    相关文章

      网友评论

        本文标题:iOS线程死锁

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