美文网首页
iOS底层原理——浅谈多线程

iOS底层原理——浅谈多线程

作者: yangfei02821 | 来源:发表于2020-05-20 18:23 被阅读0次

iOS-浅谈多线程

一、造成线程堵塞的条件:

1、当前串行队列有任务。
2、在这个任务中使用同步函数给当前串行队列添加新的任务。
使用异步或者并行队列都不会造成死锁。
线程是所有任务的大集合,具体执行是在相应的队列中。
新等旧,旧等新,造成死锁。
同步和异步最大区别:
是否会阻塞当前线程,同步会立即执行当前任务,等待任务完成之后才继续进行其他任务,而异步不会阻塞线程,只是开始执行自己的任务,线程还会继续下面的操作,不用等待异步任务完成。

什么时候会产生死锁?
使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)

- (void)test01{
    // 问题:以下代码是在主线程执行的,会不会产生死锁?会!
    NSLog(@"执行任务1");
    
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"执行任务2");
    });
    
    NSLog(@"执行任务3");
    
//    打印结果:直接跳转到堆栈列表,报错:Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
}

- (void)test02{
    // 问题:以下代码是在主线程执行的,会不会产生死锁?不会!
    NSLog(@"执行任务1");
    
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
        NSLog(@"执行任务2");
    });
    
    NSLog(@"执行任务3");
    
//        打印结果:执行任务1
//                执行任务3
//                执行任务2
}

- (void)test03{
    // 问题:以下代码是在主线程执行的,会不会产生死锁?会!
    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");
    
    //    打印结果:直接跳转到堆栈列表,报错:Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
    //假如加入另一个串行队列2,在队列1中同步在队列2中添加任务,不会造成死锁
    //只有在同一个串行队列中同步执行才回死锁。
}

- (void)test04{
    // 问题:以下代码是在主线程执行的,会不会产生死锁?不会!
    NSLog(@"执行任务1");
    
    dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_SERIAL);
//        dispatch_queue_t queue2 = dispatch_queue_create("myqueu2", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t queue2 = dispatch_queue_create("myqueu2", DISPATCH_QUEUE_SERIAL);
    
    dispatch_async(queue, ^{ // 0
        NSLog(@"执行任务2");
        
        dispatch_sync(queue2, ^{ // 1
            NSLog(@"执行任务3");
        });
        
        NSLog(@"执行任务4");
    });
    
    NSLog(@"执行任务5");
    
    //        打印结果:执行任务1
    //                执行任务5
    //                执行任务2
    //                执行任务3
    //                执行任务4
    //同步会阻塞线程,必须要完成之后才能继续接下来的任务
}

- (void)test05{
    // 问题:以下代码是在主线程执行的,会不会产生死锁?不会!
    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");
    
    //        打印结果:执行任务1
    //                执行任务5
    //                执行任务2
    //                执行任务3
    //                执行任务4
    //并发队列不会造成死锁。
}

相关文章

网友评论

      本文标题:iOS底层原理——浅谈多线程

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