美文网首页iOS bug修复iOS开发技术分享iOS进阶指南
GCD 中 dispatch_sync 引起线程的死锁

GCD 中 dispatch_sync 引起线程的死锁

作者: GF极客天涯 | 来源:发表于2016-08-13 21:51 被阅读253次
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        
        
        
        //示例1.
        
        /*
        NSLog(@"1");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"2");
        }) ;
        NSLog(@"3");
        
        //以上代码只会打印1
        // 造成死锁的原因:
        //1.  dispatch_sync在等待block语句执行完成,而block语句需要在主线程中执行,所以dispatch_sync 如果在主线程中调用就会造成死锁
        //2.dispatch_sync是同步的本身就会阻塞当前线程,也即主线程,而又往主线程里添加一个block,所以也会发生死锁
        */
        
     
        
        
        
        //示例2.
        NSLog(@"1");
        
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"2");
        });
        
    
             NSLog(@"3");
        
        
        //总结:
      
        /**
         *1.分析以上代码view Didload 在主线程中,,也即dispatch_get_main_queue()中,执行到sync时向dispatch_get_main_queue()插入同步线程,sync会等到后面的block执行完成才返回。sync又在主队列里面,是个串行队列,sync是后面才加入的,前面一个是主线程,所以sync想执行block必须等待前一个主线程执行完成,而主线程却在等待sync返回,去执行后续工作,从而造成死锁。
         *2.dispatch_sync 和 dispatch_async 区别:
         
         dispatch_async(queue,block) async异步队列,dispatch_async函数会立即返回, block会在后台异步执行。
         dispatch_sync(queue,block) sync同步队列,dispatch_sync函数不会立即返回,即阻塞当前线程,等待 block同步执行完成。
         *3.GCD队列的三种形势
         (1) The main queue:主队列,主线程就是在这个队列中
         (2) Global queue:全局并发队列
         (3) 用户队列:是用函数 dispatch_queue_create  创建的自定义队列
         */
        
    
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    
    

    相关文章

      网友评论

        本文标题:GCD 中 dispatch_sync 引起线程的死锁

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