线程死锁问题

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
    NSLog(@"3");
}
会输出什么,为什么
 
答: 输出1, 在iOS中使用 dispatch_sync(dispatch_get_main_queue()^(){block体});

dispath向主队列加一个同步的block;

此时主队列在等待    dispatch_sync(dispatch_get_main_queue(),^(){block体}); 而执行

dispatch_sync在等待主队列执行完毕。

从而造成死锁。

 

所以在ios使用主队列 dispatch_get_main_queue() 时 应该使用异步执行

dispatch_async(dispatch_get_main_queue(), ^(){

        NSLog(@"2");

 

    });

   

 结论:dispatch_sync 

会调用    dispatch_sync的线程    会等 dispatch_sync的里面的内容执行完再继续执行。

       dispatch_async

调用dispatch_async的线程   不会的等dispatch_async的内容,自己继续执行。

 

 

dispatch_sync/async(dispatch_get_main_queue(),^(){block体})

只是将block加入到队列。执行顺序按照队列顺序

而sync/async的区别在于 调用diapatch的线程是否等待dispatch执行完。

 

posted on 2015-12-16 15:00  冬_晨  阅读(126)  评论(0)    收藏  举报

导航